精华内容
下载资源
问答
  • 这个培训课程与《Java核心技术》(卷2-高级特性)第11版相配套,这版已经做了全面更新以涵盖Java SE 9和10。 在这些视频课程中,你将学习高级Java语言特性以及标准库中最有用部分。 为了充分利用这些视频课程,...
  • 本书总结并梳理了亿流量高可用,高并发原则。一共两个压缩包,以为上传大小限制, 只能分开上传。
  • 此时此刻,有这样本书可以帮到您,那就是《亿流量网站架构核心技术 跟开涛学搭建高可用高并发系统》 看到这部著作人这样评价 √经历618、双11多次大考,是保证大规模电商系统高流量、高频次葵花宝典。 ....

    网站是直接面对广大客户的,是公司的门户,必须快速响应,必须持续可用,必须抗得住洪峰。任何一个网站的发展过程中都出现过问题,影响客户体验和商业利益,公司业务规模越大,网站出现问题的损失越大。此时此刻,有这样一本书可以帮到您,那就是《亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统》

    图片描述

    看到这部著作的人这样评价

    • √经历618、双11多次大考,是保证大规模电商系统高流量、高频次的葵花宝典。
    • √集中火力讲述作者构建京东大流量系统用到的高可用和高并发原则。
    • √浓缩作者多年对网站系统升级迭代的创新、技术、实践和积累。
    • √高可用和高并发总体原则、关键技术、实战经验的总结,以及曾经踩过的坑。
    • √教你如何构建高并发、大流量系统方能经受起亿级线上用户流量的真实考验。
    • √从前端到DB底层设计,本书无不精细阐述。
    • √站在一个新高度思考网站后台技术,从应用级缓存到前端缓存,从SOA到闭环。
    • √京东多年架构升级及大促备战的高质量总结。
    • √将系统设计的深奥套路讲得如此清晰,难能可贵。
    • √完整呈现如何设计响应亿级请求的京东商品详情页系统。
    • √本书作者是将技术应用于业务、理论应用于实践的大师。
    • √地表至强,天大福利。
    • √流量并发暴增与系统架构变革的十字路口,需要这样一本书。
    • √一个亿级流量网站和一个中小型网站的技术架构难度截然不同。
    • √这种指导手册式的技术书籍,值得精读和细品。
    • √一本互联网高并发架构设计的百科全书。
    • √从各角度剖析系统设计的优化要点和注意事项。
    • √循序渐进地将一系列复杂问题阐述得清晰、易读。
    • √实战出真理,选择这本书,靠谱。

    目录

    第1部分 概述 / 1 
    1 交易型系统设计的一些原则 / 2 
    1.1 高并发原则 / 3 
    1.2 高可用原则 / 10 
    1.2.1 降级 / 10 
    1.2.2 限流 / 11 
    1.2.3 切流量 / 12 
    1.2.4 可回滚 / 12 
    1.3 业务设计原则 / 12 
    1.3.1 防重设计 / 13 
    1.3.2 幂等设计 / 13 
    1.3.3 流程可定义 / 13 
    1.3.4 状态与状态机 / 13 
    1.3.5 后台系统操作可反馈 / 14 
    1.3.6 后台系统审批化 / 14 
    1.3.7 文档和注释 / 14 
    1.3.8 备份 / 14 
    1.4 总结 / 14 
    第2部分 高可用 / 17 
    2 负载均衡与反向代理 / 18 
    2.1 upstream配置 / 20 
    2.2 负载均衡算法 / 21 
    2.3 失败重试 / 23 
    2.4 健康检查 / 24 
    2.4.1 TCP心跳检查 / 24 
    2.4.2 HTTP心跳检查 / 25 
    2.5 其他配置 / 25 
    2.5.1 域名上游服务器 / 25 
    2.5.2 备份上游服务器 / 26 
    2.5.3 不可用上游服务器 / 26 
    2.6 长连接 / 26 
    2.7 HTTP反向代理示例 / 29 
    2.8 HTTP动态负载均衡 / 30 
    2.8.1 Consul+Consul-template / 31 
    2.8.2 Consul+OpenResty / 35 
    2.9 Nginx四层负载均衡 / 39 
    2.9.1 静态负载均衡 / 39 
    2.9.2 动态负载均衡 / 41 
    参考资料 / 42 
    3 隔离术 / 43 
    3.1 线程隔离 / 43 
    3.2 进程隔离 / 45 
    3.3 集群隔离 / 45 
    3.4 机房隔离 / 46 
    3.5 读写隔离 / 47 
    3.6 动静隔离 / 48 
    3.7 爬虫隔离 / 49 
    3.8 热点隔离 / 50 
    3.9 资源隔离 / 50 
    3.10 使用Hystrix实现隔离 / 51 
    3.10.1 Hystrix简介 / 51 
    3.10.2 隔离示例 / 52 
    3.11 基于Servlet 3实现请求隔离 / 56 
    3.11.1 请求解析和业务处理线程池分离 / 57 
    3.11.2 业务线程池隔离 / 58 
    3.11.3 业务线程池监控/运维/降级 / 58 
    3.11.4 如何使用Servlet 3异步化 / 59 
    3.11.5 一些Servlet 3异步化压测数据 / 64 
    4 限流详解 / 66 
    4.1 限流算法 / 67 
    4.1.1 令牌桶算法 / 67 
    4.1.2 漏桶算法 / 68 
    4.2 应用级限流 / 69 
    4.2.1 限流总并发/连接/请求数 / 69 
    4.2.2 限流总资源数 / 70 
    4.2.3 限流某个接口的总并发/请求数 / 70 
    4.2.4 限流某个接口的时间窗请求数 / 70 
    4.2.5 平滑限流某个接口的请求数 / 71 
    4.3 分布式限流 / 75 
    4.3.1 Redis+Lua实现 / 76 
    4.3.2 Nginx+Lua实现 / 77 
    4.4 接入层限流 / 78 
    4.4.1 ngx_http_limit_conn_module / 78 
    4.4.2 ngx_http_limit_req_module / 80 
    4.4.3 lua-resty-limit-traffic / 88 
    4.5 节流 / 90 
    4.5.1 throttleFirst/throttleLast / 90 
    4.5.2 throttleWithTimeout / 91 
    参考资料 / 92 
    5 降级特技 / 93 
    5.1 降级预案 / 93 
    5.2 自动开关降级 / 95 
    5.2.1 超时降级 / 95 
    5.2.2 统计失败次数降级 / 95 
    5.2.3 故障降级 / 95 
    5.2.4 限流降级 / 95 
    5.3 人工开关降级 / 96 
    5.4 读服务降级 / 96 
    5.5 写服务降级 / 97 
    5.6 多级降级 / 98 
    5.7 配置中心 / 100 
    5.7.1 应用层API封装 / 100 
    5.7.2 配置文件实现开关配置 / 101 
    5.7.3 配置中心实现开关配置 / 102 
    5.8 使用Hystrix实现降级 / 106 
    5.9 使用Hystrix实现熔断 / 108 
    5.9.1 熔断机制实现 / 108 
    5.9.2 配置示例 / 112 
    5.9.3 采样统计 / 113 
    6 超时与重试机制 / 117 
    6.1 简介 / 117 
    6.2 代理层超时与重试 / 119 
    6.2.1 Nginx / 119 
    6.2.2 Twemproxy / 126 
    6.3 Web容器超时 / 127 
    6.4 中间件客户端超时与重试 / 127 
    6.5 数据库客户端超时 / 131 
    6.6 NoSQL客户端超时 / 134 
    6.7 业务超时 / 135 
    6.8 前端Ajax超时 / 135 
    6.9 总结 / 136 
    6.10 参考资料 / 137 
    7 回滚机制 / 139 
    7.1 事务回滚 / 139 
    7.2 代码库回滚 / 140 
    7.3 部署版本回滚 / 141 
    7.4 数据版本回滚 / 142 
    7.5 静态资源版本回滚 / 143 
    8 压测与预案 / 145 
    8.1 系统压测 / 145 
    8.1.1 线下压测 / 146 
    8.1.2 线上压测 / 146 
    8.2 系统优化和容灾 / 147 
    8.3 应急预案 / 148 
    第3部分 高并发 / 153 
    9 应用级缓存 / 154 
    9.1 缓存简介 / 154 
    9.2 缓存命中率 / 155 
    9.3 缓存回收策略 / 155 
    9.3.1 基于空间 / 155 
    9.3.2 基于容量 / 155 
    9.3.3 基于时间 / 155 
    9.3.4 基于Java对象引用 / 156 
    9.3.5 回收算法 / 156 
    9.4 Java缓存类型 / 156 
    9.4.1 堆缓存 / 158 
    9.4.2 堆外缓存 / 162 
    9.4.3 磁盘缓存 / 162 
    9.4.4 分布式缓存 / 164 
    9.4.5 多级缓存 / 166 
    9.5 应用级缓存示例 / 167 
    9.5.1 多级缓存API封装 / 167 
    9.5.2 NULL Cache / 170 
    9.5.3 强制获取最新数据 / 170 
    9.5.4 失败统计 / 171 
    9.5.5 延迟报警 / 171 
    9.6 缓存使用模式实践 / 172 
    9.6.1 Cache-Aside / 173 
    9.6.2 Cache-As-SoR / 174 
    9.6.3 Read-Through / 174 
    9.6.4 Write-Through / 176 
    9.6.5 Write-Behind / 177 
    9.6.6 Copy Pattern / 181 
    9.7 性能测试 / 181 
    9.8 参考资料 / 182 
    10 HTTP缓存 / 183 
    10.1 简介 / 183 
    10.2 HTTP缓存 / 184 
    10.2.1 Last-Modified / 184 
    10.2.2 ETag / 190 
    10.2.3 总结 / 192 
    10.3 HttpClient客户端缓存 / 192 
    10.3.1 主流程 / 195 
    10.3.2 清除无效缓存 / 195 
    10.3.3 查找缓存 / 196 
    10.3.4 缓存未命中 / 198 
    10.3.5 缓存命中 / 198 
    10.3.6 缓存内容陈旧需重新验证 / 202 
    10.3.7 缓存内容无效需重新执行请求 / 205 
    10.3.8 缓存响应 / 206 
    10.3.9 缓存头总结 / 207 
    10.4 Nginx HTTP缓存设置 / 208 
    10.4.1 expires / 208 
    10.4.2 if-modified-since / 209 
    10.4.3 nginx proxy_pass / 209 
    10.5 Nginx代理层缓存 / 212 
    10.5.1 Nginx代理层缓存配置 / 212 
    10.5.2 清理缓存 / 215 
    10.6 一些经验 / 216 
    参考资料 / 217 
    11 多级缓存 / 218 
    11.1 多级缓存介绍 / 218 
    11.2 如何缓存数据 / 220 
    11.2.1 过期与不过期 / 220 
    11.2.2 维度化缓存与增量缓存 / 221 
    11.2.3 大Value缓存 / 221 
    11.2.4 热点缓存 / 221 
    11.3 分布式缓存与应用负载均衡 / 222 
    11.3.1 缓存分布式 / 222 
    11.3.2 应用负载均衡 / 222 
    11.4 热点数据与更新缓存 / 223 
    11.4.1 单机全量缓存+主从 / 223 
    11.4.2 分布式缓存+应用本地热点 / 224 
    11.5 更新缓存与原子性 / 225 
    11.6 缓存崩溃与快速修复 / 226 
    11.6.1 取模 / 226 
    11.6.2 一致性哈希 / 226 
    11.6.3 快速恢复 / 226 
    12 连接池线程池详解 / 227 
    12.1 数据库连接池 / 227 
    12.1.1 DBCP连接池配置 / 228 
    12.1.2 DBCP配置建议 / 233 
    12.1.3 数据库驱动超时实现 / 234 
    12.1.4 连接池使用的一些建议 / 235 
    12.2 HttpClient连接池 / 236 
    12.2.1 HttpClient 4.5.2配置 / 236 
    12.2.2 HttpClient连接池源码分析 / 240 
    12.2.3 HttpClient 4.2.3配置 / 241 
    12.2.4 问题示例 / 243 
    12.3 线程池 / 244 
    12.3.1 Java线程池 / 245 
    12.3.2 Tomcat线程池配置 / 248 
    13 异步并发实战 / 250 
    13.1 同步阻塞调用 / 251 
    13.2 异步Future / 252 
    13.3 异步Callback / 253 
    13.4 异步编排CompletableFuture / 254 
    13.5 异步Web服务实现 / 257 
    13.6 请求缓存 / 259 
    13.7 请求合并 / 261 
    14 如何扩容 / 266 
    14.1 单体应用垂直扩容 / 267 
    14.2 单体应用水平扩容 / 267 
    14.3 应用拆分 / 268 
    14.4 数据库拆分 / 271 
    14.5 数据库分库分表示例 / 275 
    14.5.1 应用层还是中间件层 / 275 
    14.5.2 分库分表策略 / 277 
    14.5.3 使用sharding-jdbc分库分表 / 279 
    14.5.4 sharding-jdbc分库分表配置 / 279 
    14.5.5 使用sharding-jdbc读写分离 / 283 
    14.6 数据异构 / 284 
    14.6.1 查询维度异构 / 284 
    14.6.2 聚合数据异构 / 285 
    14.7 任务系统扩容 / 285 
    14.7.1 简单任务 / 285 
    14.7.2 分布式任务 / 287 
    14.7.3 Elastic-Job简介 / 287 
    14.7.4 Elastic-Job-Lite功能与架构 / 287 
    14.7.5 Elastic-Job-Lite示例 / 288 
    15 队列术 / 295 
    15.1 应用场景 / 295 
    15.2 缓冲队列 / 296 
    15.3 任务队列 / 297 
    15.4 消息队列 / 297 
    15.5 请求队列 / 299 
    15.6 数据总线队列 / 300 
    15.7 混合队列 / 301 
    15.8 其他队列 / 302 
    15.9 Disruptor+Redis队列 / 303 
    15.10 下单系统水平可扩展架构 / 311 
    第4部分 案例 / 323 
    16 构建需求响应式亿级商品详情页 / 324 
    16.1 商品详情页是什么 / 324 
    16.2 商品详情页前端结构 / 325 
    16.3 我们的性能数据 / 327 
    16.4 单品页流量特点 / 327 
    16.5 单品页技术架构发展 / 327 
    16.5.1 架构1.0 / 328 
    16.5.2 架构2.0 / 328 
    16.5.3 架构3.0 / 330 
    16.6 详情页架构设计原则 / 332 
    16.7 遇到的一些坑和问题 / 339 
    16.8 其他 / 347 
    17 京东商品详情页服务闭环实践 / 348 
    17.1 为什么需要统一服务 / 348 
    17.2 整体架构 / 349 
    17.3 一些架构思路和总结 / 350 
    17.4 引入Nginx接入层 / 354 
    17.5 前端业务逻辑后置 / 356 
    17.6 前端接口服务端聚合 / 357 
    17.7 服务隔离 / 359 
    18 使用OpenResty开发高性能Web应用 / 360 
    18.1 OpenResty简介 / 361 
    18.1.1 Nginx优点 / 361 
    18.1.2 Lua的优点 / 361 
    18.1.3 什么是ngx_lua / 361 
    18.1.4 开发环境 / 362 
    18.1.5 OpenResty生态 / 362 
    18.1.6 场景 / 362 
    18.2 基于OpenResty的常用架构模式 / 363 
    18.3 如何使用OpenResty开发Web应用 / 371 
    18.4 基于OpenResty的常用功能总结 / 375 
    18.5 一些问题 / 376 
    19 应用数据静态化架构高性能单页Web应用 / 377 
    19.1 整体架构 / 378 
    19.2 数据和模板动态化 / 381 
    19.3 多版本机制 / 381 
    19.4 异常问题 / 382 
    20 使用OpenResty开发Web服务 / 383 
    20.1 架构 / 383 
    20.2 单DB架构 / 384 
    20.3 实现 / 387 
    21 使用OpenResty开发商品详情页 / 405 
    21.1 技术选型 / 407 
    21.2 核心流程 / 408 
    21.3 项目搭建 / 408 
    21.4 数据存储实现 / 410 
    21.5 动态服务实现 / 422 
    21.6 前端展示实现 / 430

    内容简介

    《亿级流量网站架构核心技术》一书总结并梳理了亿级流量网站高可用和高并发原则,通过实例详细介绍了如何落地这些原则。本书分为四部分:概述、高可用原则、高并发原则、案例实战。从负载均衡、限流、降级、隔离、超时与重试、回滚机制、压测与预案、缓存、池化、异步化、扩容、队列等多方面详细介绍了亿级流量网站的架构核心技术,让读者看后能快速运用到实践项目中。

    不管是软件开发人员,还是运维人员,通过阅读《亿级流量网站架构核心技术》都能系统地学习实现亿级流量网站的架构核心技术,并收获解决系统问题的思路和方法。

    关于作者

    张开涛,现就职于京东,“开涛的博客”公众号作者。写过《跟我学Spring》《跟我学Spring MVC》《跟我学Shiro》《跟我学Nginx+Lua开发》等系列教程,博客现有1000多万访问量。

    来源:https://blog.csdn.net/zuoninger/article/details/80128953

    展开全文
  • Java核心技术 卷II:高级特性(第9版·英文版)(上、下册)专为做实际项目程序员编写,是本真实可信、不偏不倚且简单直接Java教程,书中使用了全面测试过代码示例来阐述关键Java语言与库特性,体现了最佳...
  • 亿流量网站架构核心技术对网站负荷要进阶同学是本不错资料
  • 专题专题名称专题描述 001 Spring Boot 核心技术 ...Spring Boot 核心技术简书每篇文章码云对应源码 003 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 004 Sp...
    专题专题名称专题描述
    001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件
    002 Spring Boot 核心技术章节源码 Spring Boot 核心技术简书每一篇文章码云对应源码
    003 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解
    004 Spring Cloud 核心技术章节源码 Spring Cloud 核心技术简书每一篇文章对应源码
    005 QueryDSL 核心技术 全面讲解QueryDSL核心技术以及基于SpringBoot整合SpringDataJPA
    006 SpringDataJPA 核心技术 全面讲解SpringDataJPA核心技术
    007 SpringBoot核心技术学习目录 SpringBoot系统的学习目录,敬请关注点赞!!!

     

     

    SpringBoot学习目录

    https://www.jianshu.com/p/9a08417e4e84

     

     

    ApiBoot为接口服务而生,基于SpringBoot完成扩展、自动化配置,通过封装一系列Starter来让调用者快速集成组件,降低学习、使用门槛,提高开发效率。

    ApiBoot官网:http://apiboot.minbox.io,提供快速接入、详细使用文档等。

    ApiBoot

    《ApiBoot 2.1.1.RELEASE版本发布,支持零侵入、链路式请求日志分析框架》

    《ApiBoot 新官网发布 - 丰富使用文档》

    SpringCloud

    1. Spring Cloud GateWay 路由转发规则介绍

    2.SpringCloud组件: GateWay整合Eureka转发服务请求

    SpringBoot

    一、基础

    第一章:用一个HelloWord来阐述SpringBoot的简单与快速

    第二章:SpringBoot与JSP间不可描述的秘密

    第三章:SpringBoot使用SpringDataJPA完成CRUD

    第四章:使用Druid作为SpringBoot项目数据源(添加监控)

    第五章:配置使用FastJson返回Json视图

    第六章:如何在SpringBoot项目中使用拦截器

    第七章:SpringBoot整合JavaMail发送邮件

    第八章:使用拦截器记录你的SpringBoot的请求日志

    第九章:如何排除SpringBoot内置SpringMvc静态文件地址

    第十章:配置SpringBoot支持自动装载Servlet

    第十一章:实现SpringBoot单个、多个文件的上传

    第十二章:SpringBoot使用LogBack作为日志组件

    二、核心

    第十三章:SpringBoot实战SpringDataJPA

    第十四章:QueryDSL与SpringDataJPA共同服务于SpringBoot

    第十五章:使用SpringBoot validator让数据更真实

    第十六章:使用Redis作为SpringBoot1.5.x项目数据缓存

    第十七章:使用SpringSecurity让SpringBoot项目更安全

    第十八章:SpringBoot项目中使用SpringSecurity整合OAuth2设计项目API安全接口服务

    第十九章:使用jwt设计SpringBoot项目api接口安全服务

    第二十章:SpringBoot项目中使用WebSocker配置广播式通信

    第二十一章:SpringBoot项目中的全局异常处理

    第二十二章:SpringBoot项目多模块运用与设计

    第二十三章:SpringBoot项目多模块打包与部署

    第二十四章:SpringBoot项目多数据源配置

    第二十五章:SpringBoot添加支持CORS跨域访问

    第二十六章:SpringBoot使用@Scheduled创建定时任务

    第二十七章:SpringBoot使用ApplicationEvent&Listener完成业务解耦

    第二十八章:SpringBoot使用AutoConfiguration自定义Starter

    第二十九章:SpringBoot使用Lombok来优雅的编码

    第三十章:SpringBoot使用MapStruct自动映射DTO

    三、配置

    第三十一章:SpringBoot配置文件application.properties参数详解

    第三十二章:如何获取SpringBoot项目的applicationContext对象

    第三十三章:修改SpringBoot启动Banner

    第三十四章:SpringBoot配置类WebMvcConfigurerAdapter

    四、提升

    第三十五章:SpringBoot与单元测试的小秘密

    第三十六章:基于SpringBoot架构重写SpringMVC请求参数装载

    第三十七章:基于SpringBoot架构以及参数装载完成接口安全认证

    第三十八章:基于SpringBoot架构使用Profile完成打包环境分离

    第三十九章:基于SpringBoot & Quartz完成定时任务分布式单节点持久化

    第四十章:基于SpringBoot & Quartz完成定时任务分布式多节点负载持久化

    第四十一章:基于SpringBoot & RabbitMQ完成DirectExchange分布式消息消费

    第四十二章: 基于SpringBoot & RabbitMQ完成DirectExchange分布式消息多消费者消费

    第四十三章: 基于SpringBoot & RabbitMQ完成TopicExchange分布式消息消费

    第四十四章: 基于SpringBoot & AOP完成统一资源自动查询映射

    第四十五章:基于SpringBoot 设计业务逻辑异常统一处理

    第四十六章:SpringBoot & RabbitMQ完成消息延迟消费

    第四十七章:SpringBoot2.0新特性 - Quartz自动化配置集成

    第四十八章:SpringBoot2.0新特性 - RabbitMQ信任package设置

    第四十九章:SpringBoot2.0新特性 - 你get到WebMvcConfigurer两种配置方式了吗?

    第五十章:SpringBoot2.0新特性 - 岂止至今最简单redis缓存集成

    第五十一章:基于SpringBoot2 & MongoDB完成自动化集成

    第五十二章:使用SpringBoot Data Rest读取MongoDB内的数据

    上述是有关SpringBoot初期目标的目录,后期在更新文章中可能还会添加,每次添加都会修改本文章内容,并且每次发布新文章都会添加超链接到对应的章节。SpringBoot目标达成后还会有SpringCloud去构建微服务,希望大家多多支持。

    转载于:https://www.cnblogs.com/xiang--liu/p/11507233.html

    展开全文
  • JAVA核心技术--高级特征(第八版) PDF格式 是扫描版 因为太大 我权限只能上传60M 所以分成了四部分
  • 《亿流量网站架构核心技术书总结并梳理了亿流量网站高可用和高并发原则,通过实例详细介绍了如何落地这些原则。本书分为四部分:概述、高可用原则、高并发原则、案例实战。从负载均衡、限流、降级、隔离、...
  • 致读者本书是按照Java SE 8完全更新后《Java核心技术 卷Ⅱ 高级特性(原书第10版)》。卷Ⅰ主要介绍了Java语言一些关键特性;而本卷主要介绍编程人员进行专业软件开发时需要了解高级主题。因此,与本书卷Ⅰ...

    image

    前  言

    致读者
    本书是按照Java SE 8完全更新后的《Java核心技术 卷Ⅱ 高级特性(原书第10版)》。卷Ⅰ主要介绍了Java语言的一些关键特性;而本卷主要介绍编程人员进行专业软件开发时需要了解的高级主题。因此,与本书卷Ⅰ和之前的版本一样,我们仍将本书定位于用Java技术进行实际项目开发的编程人员。
    编写任何一本书籍都难免会有一些错误或不准确的地方。我们非常乐意听到读者的意见。当然,我们更希望对本书问题的报告只听到一次。为此,我们创建了一个FAQ、bug修正以及应急方案的网站http:// horstmann.com/corejava。你可以在bug报告网页(该网页的目的是鼓励读者阅读以前的报告)的末尾处添加bug报告,以此来发布bug和问题并给出建议,以便我们改进本书将来版本的质量。
    内容提要
    本书中的章节大部分是相互独立的。你可以研究自己最感兴趣的主题,并可以按照任意顺序阅读这些章节。
    在第1章中,你将学习Java 8的流库,它带来了现代风格的数据处理机制,即只需指定想要的结果,而无须详细描述应该如何获得该结果。这使得流库可以专注于优化的计算策略,对于优化并发计算来说,这显得特别有利。
    第2章的主题是输入输出处理。在Java中,所有I/O都是通过输入/输出流来处理的。这些流(不要与第1章的那些流混淆了)使你可以按照统一的方式来处理与各种数据源之间的通信,例如文件、网络连接或内存块。我们对各种读入器和写出器类进行了详细的讨论,它们使得对Unicode的处理变得很容易。我们还展示了如何使用对象序列化机制从而使保存和加载对象变得容易而方便,及其背后的原理。然后,我们讨论了正则表达式和操作文件与路径。
    第3章介绍XML,介绍怎样解析XML文件,怎样生成XML以及怎样使用XSL转换。在一个实用示例中,我们将展示怎样在XML中指定Swing窗体的布局。我们还讨论了XPath API,它使得“在XML的干草堆中寻找绣花针”变得更加容易。
    第4章介绍网络API。Java使复杂的网络编程工作变得很容易实现。我们将介绍怎样创建连接到服务器上,怎样实现你自己的服务器,以及怎样创建HTTP连接。
    第5章介绍数据库编程,重点讲解JDBC,即Java数据库连接API,这是用于将Java程序与关系数据库进行连接的API。我们将介绍怎样通过使用JDBC API的核心子集,编写能够处理实际的数据库日常操作事务的实用程序。(如果要完整介绍JDBC API的功能,可能需要编写一本像本书一样厚的书才行。)最后我们简要介绍了层次数据库,探讨了一下JNDI(Java命名及目录接口)以及LDAP(轻量级目录访问协议)。
    Java对于处理日期和时间的类库做出过两次设计,而在Java 8中做出的第三次设计则极富魅力。在第6章,你将学习如何使用新的日期和时间库来处理日历和时区的复杂性。
    第7章讨论了一个我们认为其重要性将会不断提升的特性—国际化。Java编程语言是少数几种一开始就被设计为可以处理Unicode的语言之一,不过Java平台的国际化支持则走得更加深远。因此,你可以对Java应用程序进行国际化,使得它们不仅可以跨平台,而且还可以跨越国界。例如,我们会展示怎样编写一个使用英语、德语和汉语的退休金计算器。
    第8章讨论了三种处理代码的技术。脚本机制和编译器API允许程序去调用使用诸如JavaScript或Groovy之类的脚本语言编写的代码,并且允许程序去编译Java代码。可以使用注解向Java程序中添加任意信息(有时称为元数据)。我们将展示注解处理器怎样在源码级别或者在类文件级别上收集这些注解,以及怎样运用这些注解来影响运行时的类行为。注解只有在工具的支持下才有用,因此,我们希望我们的讨论能够帮助你根据需要选择有用的注解处理工具。
    第9章继续介绍Java安全模型。Java平台一开始就是基于安全而设计的,该章会带你深入内部,查看这种设计是怎样实现的。我们将展示怎样编写用于特殊应用的类加载器以及安全管理器。然后介绍允许使用消息、代码签名、授权以及认证和加密等重要特性的安全API。最后,我们用一个使用AES和RSA加密算法的示例进行了总结。
    第10章涵盖了没有纳入卷Ⅰ的所有Swing知识,尤其是重要但很复杂的树形构件和表格构件。随后我们介绍了编辑面板的基本用法、“多文档”界面的Java实现、在多线程程序中用到的进度指示器,以及诸如闪屏和支持系统托盘这样的“桌面集成特性”。我们仍着重介绍在实际编程中可能遇到的最为有用的构件,因为对Swing类库进行百科全书般的介绍可能会占据好几卷书的篇幅,并且只有专门的分类学家才感兴趣。
    第11章介绍Java 2D API,你可以用它来创建实际的图形和特殊的效果。该章还介绍了抽象窗口操作工具包(AWT)的一些高级特性,这部分内容看起来过于专业,不适合在卷I中介绍。虽然如此,这些技术还是应该成为每一个编程人员工具包的一部分。这些特性包括打印和用于剪切粘贴及拖放的API。
    第12章介绍本地方法,这个功能可以让你调用为微软Windows API这样的特殊机制而编写的各种方法。很显然,这种特性具有争议性:使用本地方法,那么Java平台的跨平台特性将会随之消失。虽然如此,每个为特定平台编写Java应用程序的专业开发人员都需要了解这些技术。有时,当你与不支持Java平台的设备或服务进行交互时,为了你的目标平台,你可能需要求助于操作系统API。我们将通过展示如何从某个Java程序访问Windows注册表API来阐明这一点。

    目 录

    第1章 Java SE 8的流库
    1.1 从迭代到流的操作
    1.2 流的创建
    1.3 filter、map和flatMap方法
    1.4 抽取子流和连接流
    1.5 其他的流转换
    1.6 简单约简
    1.7 Optional类型
    1.7.1 如何使用Optional值
    1.7.2 不适合使用Optional值的方式
    1.7.3 创建Optional值
    1.7.4 用flatMap来构建Optional值的函数
    1.8 收集结果
    1.9 收集到映射表中
    1.10 群组和分区
    1.11 下游收集器
    1.12 约简操作
    1.13 基本类型流
    1.14 并行流
    第2章 输入与输出
    2.1 输入/输出流
    2.1.1 读写字节
    2.1.2 完整的流家族
    2.1.3 组合输入/输出流过滤器
    2.2 文本输入与输出
    2.2.1 如何写出文本输出
    2.2.2 如何读入文本输入
    2.2.3 以文本格式存储对象
    2.2.4 字符编码方式
    2.3 读写二进制数据
    2.3.1 DataInput和DataOutput接口
    2.3.2 随机访问文件
    2.3.3 ZIP文档
    2.4 对象输入/输出流与序列化
    2.4.1 保存和加载序列化对象
    2.4.2 理解对象序列化的文件格式
    2.4.3 修改默认的序列化机制
    2.4.4 序列化单例和类型安全的枚举
    2.4.5 版本管理
    2.4.6 为克隆使用序列化
    2.5 操作文件
    2.5.1 Path
    2.5.2 读写文件
    2.5.3 创建文件和目录
    2.5.4 复制、移动和删除文件
    2.5.5 获取文件信息
    2.5.6 访问目录中的项
    2.5.7 使用目录流
    2.5.8 ZIP文件系统
    2.6 内存映射文件
    2.6.1 内存映射文件的性能
    2.6.2 缓冲区数据结构
    2.6.3 文件加锁机制
    2.7 正则表达式
    第3章 XML
    3.1 XML概述
    3.1.1 XML文档的结构
    3.2 解析XML文档
    3.3 验证XML文档
    3.3.1 文档类型定义
    3.3.2 XML Schema
    3.3.3 实用示例
    3.4 使用XPath来定位信息
    3.5 使用命名空间
    3.6 流机制解析器
    3.6.1 使用SAX解析器
    3.6.2 使用StAX解析器
    3.7 生成XML文档
    3.7.1 不带命名空间的文档
    3.7.2 带命名空间的文档
    3.7.3 写出文档
    3.7.4 示例:生成SVG文件
    3.7.5 使用StAX写出XML文档
    3.8 XSL转换

    展开全文
  • 本文架子参考张开套《亿流量网站架构核心技术》这本书分为四个部分:指导原则,高可用,高并发,实践案例。这篇文章说说前三个部分,大部分内容都是我自己思考,书只作为参考。指导原则高可用事前副本技术...

    本文的架子参考张开套的《亿级流量网站架构核心技术》这本书分为四个部分:指导原则,高可用,高并发,实践案例。这篇文章说一说前三个部分,大部分内容都是我自己的思考,书只作为参考。

    • 指导原则
    • 高可用
      • 事前
        • 副本技术
        • 隔离技术
        • 配额技术
        • 探知技术
        • 预案
      • 事发
        • 监控和报警
      • 事中
        • 降级
        • 回滚
        • failXXX系列
      • 事后
    • 高并发
      • 提高处理速度
        • 缓存
        • 异步
      • 增加处理人手
        • 多线程
        • 扩容

    指导原则

    书中所列举的,里有一些可能并不是原则,而是技巧。我理解的原则如下:

    高并发原则:

    1. 无状态设计:因为有状态可能涉及锁操作,锁又可能导致并发的串行化。
    2. 保持合理的粒度:无论拆分还是服务化,其实就是服务粒度控制,控制粒度为了分散请求提高并发,或为了从管理等角度提高可操性。
    3. 缓存、队列、并发等技巧在高并发设计上可供参考,但需依场景使用。

    高可用原则:

    1. 系统的任何发布必须具有可回滚能力。
    2. 系统任何外部依赖必须准确衡量是否可降级,是否可无损降级,并提供降级开关。
    3. 系统对外暴露的接口必须配置好限流,限流值必须尽量准确可靠。

    业务设计原则:

    1. 安全性:防抓取,防刷单、防表单重复提交,等等等等。
    2. at least 消费,应考虑是否采用幂等设计
    3. 业务流程动态化,业务规则动态化
    4. 系统owner负责制、人员备份制、值班制
    5. 系统文档化
    6. 后台操作可追溯

    以上原则只是大千世界中的一小部分,读者应当在工作学习中点滴积累。

    高可用

    我们先说高可用的本质诉求:高可用就是抵御不确定性,保证系统7*24小时健康服务。关于高可用,我们其实面对的问题就是对抗不确定性,这个不确定性来自四面八方。比如大地震,会导致整个机房中断,如何应对?比如负责核心系统的工程师离职了,如何应对?再比如下游接口挂了,如何应对?系统磁盘坏了,数据面临丢失风险,如何应对?我想关于上述问题的应对方式,大家在工作中或多或少都有所了解,而这个不确定性的处理过程,就是容灾,其不同的‘灾难’,对应不同的容灾级别。

    为了对抗这些不同级别的不确定性,就要付出不同级别的成本,因此可用性也应是有标准的。这标准就是大家常说的N个9。随着N的增加,成本也相应增加,那如何在达到业务需要的可用性的基础上,尽量节省成本?这也是一个值得思考的话题。除此之外,100%减去这N个9就说所谓的平均故障时间(MTBF),很多人只关心那些9,而忽略了故障处理时间,这是不该的:你的故障处理速度越快,系统的可用性才有可能越高。

    上面扯了一些可用性概念上的东西,下面来说一下技巧。开涛的书中没有对可用性技巧做出一个分类,我这里则尝试使用‘事情’来分个类。这里的‘事’就是故障,分为:事前(故障发生以前)、事发(故障发生到系统或人感知到故障)、事中(故障发生到故障处理这段时间)、事后(故障结束之后)。

    按照上述分类,不同的阶段应有着不同的技巧:

    1. 事前:副本、隔离、配额、提前预案、探知
    2. 事发:监控、报警
    3. 事中:降级、回滚、应急预案,failXXX系列
    4. 事后:复盘、思考、技改

    事前

    副本技术

    大自然是副本技术当之无愧的集大成者,无论是冰河时代,还是陨石撞击地球所带来的毁灭性打击,物种依然绵绵不绝的繁衍,这便是基因复制的作用。副本是对抗不确定性的有力武器,把副本技术引入计算机系统,也会带来高可用性的提升。无状态服务集群便是副本的一个应用,因为没有状态,便可水平伸缩,而这些无状态服务器之间需要一层代理来统一调度管理,这便有了反向代理。当代理通过心跳检测机制检测到有一台机器出现问题时,就将其下线,其他‘副本’机器继续提供服务;存储领域也是经常使用副本技术的,比如OB的三地三中心五副本技术等,mysql主备切换,rabbitMQ的镜像队列,磁盘的RAID技术,各种nosql中的分区副本,等等等等,数不胜数,几乎所有保证高可用的系统都有冗余副本存在。

    隔离技术

    书上提到了很多种隔离:线程隔离、进程隔离、集群隔离、机房隔离、读写隔离、动静隔离、爬虫隔离、热点隔离、硬件资源隔离。在我看来,这些隔离其实就是一种,即资源隔离,无论线程、进程、硬件、机房、集群都是一种资源;动态资源和静态资源也不过是资源的一种分类;热点隔离也即是热点资源和非热点资源的隔离;读写隔离不过仅仅是资源的使用方式而已,相同的两份资源,一份用来写,一份用来读。因此,隔离的本质,其实就是对资源的独立保护。因为每个资源都得到了独立的保护,其中一个资源出了问题,不会影响到其他资源,这就提高了整体服务的可用性。人类使用隔离术也由来已久了,从农业养殖,到股票投资,甚至关犯人的监狱,都能找到隔离术的影子。

    配额技术

    配额技术通过限制资源供给来保护系统,从而提高整体可用性。限流是配额技术的一种,它通过调节入口流量水位上线,来避免供给不足所导致的服务宕机。限流分为集群限流和单机限流,集群限流需要分布式基础设施配合,单机限流则不需要。大部分业务场景使用单机限流足以,特殊场景(类秒杀等)下的限流则需限制整个集群。除此之外,限流这里我们还需要考虑几点:

    1. 如何设置合理的限流值?限流值的设定是需要经过全链路压测、妥善评估CPU容量、磁盘、内存、IO等指标与流量之间的变化关系(不一定线性关系)、结合业务预估和运维经验后,才能确定。
    2. 对于被限流的流量如何处理?有几种处理方式,其一直接丢弃,用温和的文案提醒用户;其二,静默,俗称的无损降级,用缓存内容刷新页面;其三,蓄洪,异步回血,这一般用于事务型场景。
    3. 会不会导致误杀?单机限流会导致误杀,尤其当负载不均衡的情况下,很容易出现误杀;单机限流值设定过小也容易出现误杀的情况。

    探知技术

    其只用于探知系统当前可用性能力,无法切实提高系统可用性,做不好甚至还会降低系统可用性。压测和演练和最常见的探知技术 。压测分为全链路压测和单链路压测,全链路压测用于像双十一大促活动等,需要各上下游系统整体配合,单链路压测一般验证功能或做简单的单机压测提取性能指标。全链路压测的一般过程是:压测目标设定和评估,压测改造,压测脚本编写部署,压测数据准备,小流量链路验证,通知上下游系统owner,压测预热,压测,压测结果评估报告,性能优化。以上过程反复迭代,直到达到压测目标为止;演练一般按规模划分:比如城市级别的容灾演练,机房级别的容灾演练,集群规模的容灾演练(DB集群,缓存集群,应用集群等),单机级别的故障注入,预案演练等。演练的作用无需过多强调,但演练一般发生在凌晨,也需要各系统owner配合排错,着实累人,一般都是轮班去搞。

    预案

    预案一般分为提前预案(事前)和应急预案(事中)。提前预案提前执行,比如将系统临时从高峰模式切换成节能模式;应急预案关键时刻才执行,主要用于止血,比如一键容灾切换等。预案技术一般要配合开关使用,推预案一般也就是推开关了。除此之外,预案也可和限流、回滚、降级等相结合,并可以作为一个定期演练项目。

    事发

    事发是指当故障发生了到系统或人感知到故障准备处理的这段时间,核心诉求即是如何快速、准确的识别故障。

    监控和报警

    一般出现故障的时候,老板大多会有三问:为什么才发现?为什么才解决?影响有多大?即使故障影响面较大,如果能迅速止血,在做复盘的时候多少能挽回一些面子,相反如果处理不及时,即使小小的故障,都可能让你丢了饭碗。越早识别故障,就能越早解决问题,而这眼睛便是监控和报警了。监控报警耳熟能详,这里不多赘述。

    事中

    事中是指当故障发生时,为了保证系统可用性,我们可以或必须做的事情。分为降级、回滚、应急预案(见上文,这里不多数了),faillXXX系列。

    降级

    降级的内涵丰富,我们只从链路角度去思考。降级的本质是弃车保帅,通过临时舍弃部分功能,保证系统整体可用性。降级虽然从整体上看系统仍然可用,但由于取舍的关系,那么可知所有的降级一定是有损的。不可能有真正的无损降级,而常说的无损降级指的是用户体验无损。降级一定发生在层与层之间(上下游),要么a层临时性不调用b层,这叫做熔断,要么a层临时调用c层(c层合理性一定<b层),这叫备用链路。无论是哪一种方式,都会面临一个问题:如何确定什么时候降级,什么时候恢复?一般有两种方式,其一是人工确认,通过监控报警等反馈机制,人工识别故障,推送降级,待故障恢复后在手动回滚;其二是自适应识别,最常用的指标有超时时间、错误次数、限值流等等,当达到阈值时自动执行降级,恢复时自动回滚。这两种方式无需对比,它们都是经常采用的高可用技巧。除此之外,我们还要注意降级和强弱依赖的关系。强弱依赖表示的是链路上下游之间的依赖关系,是’是否可降级‘的一种专业表述。

    我们再来看书中的一些降级的例子:①读写降级,实际上是存储层和应用层之间的降级,采用备用链路切换方式,损失了一致性;②功能降级,将部分功能关闭,实际上是应用层和功能模块层之间的降级,采用熔断方式,损失了部分功能。③爬虫降级,实际上是搜索引擎爬虫和应用系统之间的降级,采用备用链路切换方式,将爬虫引导到静态页面,损失是引擎索引的建立和页面收录。

    回滚

    当执行某种变更出现故障时,最为稳妥和有效的办法就是回滚。虽然回滚行之有效,但并不简单,因为回滚有一个大前提:变更必须具有可回滚性。而让某一种变更具有可回滚的特性,是要耗费很大力气的。索性的是,大部分基础服务已经帮我们封装好了这一特性,比如DB的事务回滚(DB事务机制),代码库回滚(GIT的文件版本控制),发布回滚(发布系统支持)等等。我们在日常变更操作的时候,必须要确定你的操作是否可回滚,并尽力保证所有变更均可回滚。如果不能回滚,是否可以进行热更新(比如发布应用到app store)或最终一致性补偿等额外手段保证系统高可用。

    failXXX系列

    当出现下游调用失败时,我们一般有几种处理方式:

    1. failretry,即失败重试,需要配合退避时间,否则马上重试不一定会有效果。
    2. failover,即所谓的故障转移。比如调用下游a接口失败,那么RPC的负载均衡器将会调用a接口提供方的其他机器进行重试;在比如数据库x挂了,应用自适应容灾将对x库的调用切换到y库调用,此y库即可以是faillover库(流水型业务),也可以备库(状态型业务)。
    3. failsafe,即静默,一般下游链路是弱依赖的时候,可以采用failsafe,即可和failover相结合,比如failover了3次还是失败,那么执行failsafe。
    4. failfast,立即报错,failfast主要让工程师快速的感知问题所在,并及时进行人工干预。
    5. failback,延迟补偿(回血),一般可以采用消息队列或定时扫描等。

    上面的1,2,4是属于重试策略,即书中《超时与重试》章节所讲到的重试。重试有个问题:退避间隔是多少?重试几次?一般在下游临时抖动的情况下,很短时间内就可以恢复;但当下游完全不可用,那么很有可能重试多少次都不会成功,反而会对下游造成了更大的压力,那这种情况就应当做用熔断了。所以正确设定重试次数、选择退避时间等都是需要仔细思考的。我们在来说一下超时,超时只是一种预防机制,不是故障应对策略,其主要为了防止请求堆积——资源都用于等待下游请求返回了。堆积的后果自不用多说,重要的是如何选择正确的超时时间?书上只说了链路每个部分超时时间怎么配置,却不知道应配置多少,这是不够全面的。

    事后

    复盘、思考、技改。不多赘述。

    高并发

    如果仅是追求高可用性,这其实并不难做,试想如果一年只有一个人访问你的系统,只要这一个人访问成功,那你系统的‘’可用性‘就是100%了。可现实是,随着业务的发展,请求量会越来越高,进而各种系统资源得以激活,那潜在风险也会慢慢的暴露出来。因此,做系统的难点之一便是:如何在高并发的条件下,保证系统的高可用。上文已经说了一些保证高可用的技巧,这节将结合开涛的书,说说高并发。

    说到这里,也给大家推荐一个交流平台:架构交流群650385180,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理、并发编程原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,相信对于已经工作和遇到技术瓶颈的码友,在这个群里一定有你需要的内容。

    上图是我们生活中常见的一个场景——排队购物。收银员就是我们的服务,每一个在队列中的顾客都是一个请求。我们的本质诉求是让尽可能多的人都在合理的等待时间内完成消费。如何做到这一点呢?其一是提高收银员的处理速度,他们处理的越快,单位时间内就能服务更多的顾客;其二是增加人手,一名收银员处理不过来,我们就雇十名收银员,十名不够我们就雇佣一百名(如果不计成本);其三是减少访问人数,也即分流过滤,将一些人提前过滤掉,或做活动预热(比如双十一预热),在高峰之前先满足一部分人的需求。因此,想要高并发无外乎从以下几个方面入手:

    1. 提高处理速度:缓存、异步
    2. 增加处理人手:多线程(多进程)、扩容
    3. 减少访问人数:预处理(本文不涉及)

    提高处理速度

    缓存

    缓存之所以能够提高处理速度,是因为不同设备的访问速度存在差异。缓存的话题可以扯几本书不带重样的。从CPU可以一直扯到客户端缓存,即从最底层一直到扯到最特近用户的一层,每一层都可能或可以有缓存的存在。我们这里不扯这么多,只说简单服务端缓存。现在从几个不同角度来看一下缓存:

    ①从效果角度。命中率越高越好吗?10万个店铺数据,缓存了1000个,命中率稳定100%,那是不是说,有99000个店铺都是长尾店铺?缓存效果评估不能单看命中率。
    ②从回收策略。如果把缓存当做数据库一样的存储设备去用,那就没有回收的说法了(除非重启或者宕机,否则数据依然有效);如果只存储热数据,那就有回收和替换的问题。回收有两种方式,一种是空间配额,另一种是时间配额。替换也有几种方式,LRU,FIFO,LFU。
    ③从缓存使用模式角度:用户直接操作缓存和db;用户直接操作缓存,缓存帮助我们读写DbB;
    ④从缓存分级角度。java堆内缓存、java堆外缓存、磁盘缓存、分布式缓存,多级缓存。
    ⑤从缓存使用角度。null穿透问题、惊群问题、缓存热点问题、缓存一致性问题、读写扩散问题。。。。。。
    ⑥更新方式。读更新、写更新、异步更新。

    如果缓存集群涉及到异地多集群部署,再结合大数据量高并发业务场景,还会遇到很多更加复杂的问题,这里就不一一列举了。

    异步

    异步这里有几点内涵,其一是将多个同步调用变成异步并发调用,这样就将总响应时间由原来的t1+t2+t3+…..+tn变成了max(t1,t2,t3….,tn),这也叫异步编排;其二是在操作系统层面,使用asyc io以提高io处理性能;其三是将请求’转储‘,稍后异步进行处理,一般使用队列中间件。其中的异步编排,可以使用CompletableFuture;异步IO一般框架都做了封装;而队列中间件则是最为常用的技术之一,也是我们重点关注的对象。

    业务允许延迟处理,是使用队列中间件的大前提,即非实时系统或准实时系统更适合使用。主要作用有:异步处理(增加吞吐),削峰蓄洪(保障稳定性),数据同步(最终一致性组件),系统解耦(下游无需感知订阅方)。

    缓冲队列:一般使用环形缓冲队列,控制缓冲区大小。
    任务队列:一般用于任务调度系统,比如线程池等,disrupter
    消息队列:一般意义上的消息中间件,不同业务场景需要的中间件能力不同,有的需要高吞吐,有的需要支持事务,有的需要支持多客户端,有的需要支持特定协议等等等等,妄图开发一个大而全的消息队列,个人觉得不如提供多种队列按需选型,之后在统一提供一个通信中台,全面整合消息能力。
    请求队列:就是处理请求的队列,有点像流程引擎,可以做一些前置后置的入队出队处理,比如限流、过滤等等
    数据总线队列:比如canal,datax等数据(异构或同构)同步用的。
    优先级队列:一般大根堆实现
    副本队列:如果队列支持回放,副本队列有些冗余。
    镜像队列:一般用于做队列系统的高可用切换的。有时候也跨集群跨机房做复制,提供更多消费者消费,增加投递能力。

    队列的消费端有pull模式或者push模式的选取。pull模式可以控制进度,push模式则实时性更高一些;pull能支持单队列上的有序,push很难支持。除了消费模式,队列还有一系列其他问题请参考其他书籍,这里不多说明了。

    这里在补充一点关于异步的说明。同步转异步,可以提高吞吐量;异步转同步,可以增加可靠性。

    增加处理人手

    多线程

    多线程(多进程)技术是‘增加处理人手’技术中最容易想到的,一般我们也广泛采用。无论是web服务容器、网关、RPC服务端、消息队列消费和发送端等等都有使用多线程技术。其优点也无需过多说明。这里我们只说一件重要的事情,即线程数的设置问题,如果线程数过高则可能会吃光系统资源,如果过低又无法发挥多线程优势。一般设置的时候,会参考平均处理时长、并发峰值、平均并发量、阻塞率、最长可容忍响应时间、CPU核心数等等,然后做一定的运算,计算出线程数、core和max,以及阻塞队列大小。具体算法可以自行谷歌。

    扩容

    在无状态服务下,扩容可能是迄今为止效果最明显的增加并发量的技巧之一。有临时性并发问题时,可以直接提扩容工单,立竿见影。但扩容的最大问题就是成本了,想想动辄几万的实体机,如果只是为了支撑一个小时的大促,而平常利用率几乎为0,那确实是浪费。因此便有了弹性云,当需要扩容时,借别人机器(阿里云)用完再还回去;以及离线在线混部,充分利用资源。

    从扩容方式角度讲,分为垂直扩容(scale up)和水平扩容(scale out)。垂直扩容就是增加单机处理能力,怼硬件,但硬件能力毕竟还是有限;水平扩容说白了就是增加机器数量,怼机器,但随着机器数量的增加,单应用并发能力并不一定与其呈现线性关系, 此时就可能需要进行应用服务化拆分了。

    从数据角度讲,扩容可以分为无状态扩容和有状态扩容。无状态扩容一般就是指我们的应用服务器扩容;有状态扩容一般是指数据存储扩容,要么将一份数据拆分成不同的多份,即sharding,要么就整体复制n份,即副本。sharding遇到的问题就是分片的可靠性,一般做转移、rehash、分片副本;副本遇到的问题是一致性性,一般做一致性算法,如paxos,raft等。

    展开全文
  • 《亿流量网站架构核心技术书总结并梳理了亿流量网站高可用和高并发原则,通过实例详细介绍了如何落地这些原则。本书分为四部分:概述、高可用原则、高并发原则、案例实战。从负载均衡、限流、降级、隔离、...
  • 、PHP核心技术 1.写出个能创建多级目录PHP函数(新浪网技术部) &lt;?php /** * 创建多级目录 * @param $path string 要创建目录 * @param $mode int 创建目录模式,在win...
  • 这本张开涛亿流量网站架构核心技术非常值得看,懂点架构,让挨踢狗工资更上个台阶
  • .Net核心技术,着重于应用开发,最实用高级技术。 (压缩后有三个部分,这是第个)
  • 《亿流量网站架构核心技术书总结并梳理了亿流量网站高可用和高并发原则,通过实例详细介绍了如何落地这些原则。本书分为四部分:概述、高可用原则、高并发原则、案例实战。从负载均衡、限流、降级、隔离、...
  • 《亿流量网站架构核心技术书总结并梳理了亿流量网站高可用和高并发原则,通过实例详细介绍了如何落地这些原则。本书分为四部分:概述、高可用原则、高并发原则、案例实战。从负载均衡、限流、降级、隔离、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,961
精华内容 3,584
关键字:

核心技术的一级