一、概述
主要功能:应用解耦,异步消息,流量削锋等问题
架构设计:实现高性能,高可用,可伸缩和最终一致性架构
常用消息队列:ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
使用场景:
1)RabbitMQ:对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次(集群不能动态扩展)
2)RocketMQ:具有高吞吐量、高可用性、适合大规模分布式系统应用的特点(支持的语言较少,语言支持的情况下优先选择)
3)Kafka:基于Pull的模式来处理消息消费,追求高吞吐量,适合产生大量数据的互联网服务的数据收集业务(多数用于处理日志)
二、核心功能理解
解耦:一个事务,只关心核心的流程。而需要依赖其他系统但不那么重要的事情,有通知即可,无需等待结果
异步消息:
一致性:保证消息的可靠性
1)强一致性:
2)最终一致性:主要是用“记录”和“补偿”的方式。在做所有的不确定的事情之前,先把事情记录下来,然后去做不确定的事情,结果可能是:成功、失败或是不确定,“不确定”(例如超时等)可以等价为失败。成功就可以把记录的东西清理掉了,对于失败和不确定,可以依靠定时任务等方式把所有失败的事情重新执行一遍,直到成功为止
三、使用总结
1.消息队列不是万能的,对于需要强事务保证而且延迟敏感的,RPC是优于消息队列的。
2.对于一些无关痛痒,或者对于别人非常重要但是对于自己不是那么关心的事情,可以利用消息队列去做。
3.支持最终一致性的消息队列,能够用来处理延迟不那么敏感的“分布式事务”场景,而且相对于笨重的分布式事务,可能是更优的处理方式。
4.当上下游系统处理能力存在差距的时候,利用消息队列做一个通用的“漏斗”,在下游有能力处理的时候,再进行分发。
一、概述
原理:
1) 将数据写入/读取速度更快的存储(设备)
2) 将数据缓存到离应用最近的位置
3)将数据缓存到离用户最近的位置
缓存分类
1)CDN缓存
2)反向代理缓存
3)分布式Cache
4)本地应用缓存
缓存媒介
1)常用中间件:Varnish,Ngnix,Squid,Memcache,Redis,Ehcache等
2)缓存的内容:文件,数据,对象
3)缓存的介质:CPU,内存(本地,分布式),磁盘(本地,分布式)
缓存设计
1)缓存的内容:1.热点数据;2.静态资源
2)缓存的位置:CDN,反向代理,分布式缓存服务器,本机(内存,硬盘)
缓存策略
1)过期策略:(1)固定时间:比如指定缓存的时间是30分钟;(2)相对时间:比如最近10分钟内没有访问的数据;
2)同步机制:(1)实时写入;(2)异步刷新
缓存的目的:将热点数据放到离用户最近或访问速度更快的介质中,加快数据的访问,减小响应时间
二、CDN缓存
原理:CDN的基本原理是广泛采用各种缓存服务器,将缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求
CDN主要解决将数据缓存到离用户最近的位置,一般缓存静态资源文件(页面,脚本,图片,视频,文件等)。
国内网络异常复杂,跨运营商的网络访问会很慢。为了解决跨运营商或各地用户访问问题,可以在重要的城市,部署CDN应用。使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
(1) 未部署CDN应用前
网络请求路径:
请求:本机网络(局域网)——》运营商网络——》应用服务器机房
响应:应用服务器机房——》运营商网络——》本机网络(局域网)
在不考虑复杂网络的情况下,从请求到响应需要经过3个节点,4个步骤完成一次用户访问操作。
(2) 部署CDN应用后
网络路径:
请求:本机网络(局域网)——》运营商网络
响应:运营商网络——》本机网络(局域网)
在不考虑复杂网络的情况下,从请求到响应需要经过2个节点,2个步骤完成一次用户访问操作。
与不部署CDN服务相比,减少了1个节点,2个步骤的访问。极大的提高的系统的响应速度。
优点
1)本地Cache加速:提升访问速度,尤其含有大量图片和静态页面站点
2)镜像服务:消除了不同运营商之间互联的瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量
3)远程加速:远程访问用户根据DNS负载均衡技术智能自动选择Cache服务器,选择最快的Cache服务器,加快远程访问的速度
4)带宽优化:自动生成服务器的远程Mirror(镜像)cache服务器,远程用户访问时从cache服务器上读取数据,减少远程访问的带宽、分担网络流量、减轻原站点WEB服务器负载等功能
5)集群抗攻击:广泛分布的CDN节点加上节点之间的智能冗余机制,可以有效地预防黑客入侵以及降低各种D.D.o.S攻击对网站的影响,同时保证较好的服务质量
缺点
1)动态资源缓存,需要注意实时性(解决方法:主要缓存静态资源,动态资源建立多级缓存或准实时同步)
2).如何保证数据的一致性和实时性需要权衡考虑(解决方法:设置缓存失效时间(1个小时,最终一致性))
CND技术实践
目前,中小型互联网公司,综合成本考虑,一般租用第三方CDN服务,大型互联网公司,采用自建或第三方结合的方式。比如淘宝刚开始使用第三方的,当流量很大后,第三方公司无法支撑其CDN流量,淘宝最后采用自建CDN的方式实现。
淘宝CDN,如下图(来自网络):
三、反向代理缓存
原理:反向代理位于应用服务器机房,处理所有对WEB服务器的请求。如果用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。通过降低向WEB服务器的请求数,从而降低了WEB服务器的负载
代理缓存对比:常用的代理缓存有Varnish,Squid,Ngnix
1)varnish和squid是专业的cache服务,nginx需要第三方模块支持;
2)Varnish采用内存型缓存,避免了频繁在内存、磁盘中交换文件,性能比Squid高;
3)Varnish由于是内存cache,所以对小文件如css,js,小图片啥的支持很棒,后端的持久化缓存可以采用的是Squid或ATS
4) Squid功能全而大,适合于各种静态的文件缓存,一般会在前端挂一个HAProxy或nginx做负载均衡跑多个实例
5) Nginx采用第三方模块ncache做的缓冲,性能基本达到varnish,一般作为反向代理使用,可以实现简单的缓存
反向代理一般缓存静态资源,动态资源转发到应用服务器处理
Squid示例
Squid 反向代理一般只缓存静态资源,动态程序默认不缓存。根据从 WEB 服务器返回的 HTTP 头标记来缓冲静态页面。有四个最重要 HTTP 头标记:
Last-Modified: 告诉反向代理页面什么时间被修改
Expires: 告诉反向代理页面什么时间应该从缓冲区中删除
Cache-Control: 告诉反向代理页面是否应该被缓冲
Pragma: 用来包含实现特定的指令,最常用的是 Pragma:no-cache
Squid 反向代理加速网站实例
(1) 通过DNS的轮询技术,将客户端的请求分发给其中一台 Squid 反向代理服务器处理;
(2) 如果这台 Squid 缓存了用户的请求资源,则将请求的资源直接返回给用户;
(3) 否则这台 Squid 将没有缓存的请求根据配置的规则发送给邻居 Squid 和后台的 WEB 服务器处理;
(4) 这样既减轻后台 WEB 服务器的负载,又提高整个网站的性能和安全性。
四、分布式缓存-memecache
CDN,反向代理缓存,主要解决静态文件,或用户请求资源的缓存,数据源一般为静态文件或动态生成的文件(有缓存头标识)。
分布式缓存,主要指缓存用户经常访问数据的缓存,数据源为数据库。一般起到热点数据访问和减轻数据库压力的作用。
目前分布式缓存设计,在大型网站架构中是必备的架构要素。常用的中间件有Memcache,Redis。
Memcache是一个高性能,分布式内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
特性:
1)使用物理内存作为缓存区,可独立运行在服务器上。每个进程最大2G,如果想缓存更多的数据,可以开辟更多的memcache进程(不同端口)或者使用分布式memcache进行缓存,将数据缓存到不同的物理机或者虚拟机上
2)使用key-value的方式来存储数据,这是一种单索引的结构化数据组织形式,可使数据项查询时间复杂度为O(1)
3)协议简单:基于文本行的协议,直接通过telnet在memcached服务器上可进行存取数据操作,简单,方便
4)内置的内存管理方式:所有数据都保存在内存中,存取数据比硬盘快,当内存满后,通过LRU算法自动删除不使用的缓存,但没有考虑数据的容灾问题,重启服务,所有数据会丢失
5)分布式:各个memcached服务器之间互不通信,各自独立存取数据,不共享任何信息。服务器并不具有分布式功能,分布式部署取决于memcache客户端