@@ -14,36 +14,33 @@ tags:
1414
1515<!-- TOC depthFrom:2 depthTo:4 -->
1616
17- - [ 概述] ( #概述 )
18- - [ 消息队列应用场景] ( #消息队列应用场景 )
19- - [ 异步处理] ( #异步处理 )
20- - [ 应用解耦] ( #应用解耦 )
21- - [ 流量削锋] ( #流量削锋 )
22- - [ 日志处理] ( #日志处理 )
23- - [ 消息通讯] ( #消息通讯 )
24- - [ 消息中间件示例] ( #消息中间件示例 )
25- - [ 电商系统] ( #电商系统 )
26- - [ 日志收集系统] ( #日志收集系统 )
27- - [ JMS 消息服务] ( #jms-消息服务 )
28- - [ 4.1 消息模型] ( #41-消息模型 )
29- - [ 4.1.1 P2P 模式] ( #411-p2p-模式 )
30- - [ 4.1.2 Pub/sub 模式] ( #412-pubsub-模式 )
31- - [ 4.2 消息消费] ( #42-消息消费 )
32- - [ 4.3JMS 编程模型] ( #43jms-编程模型 )
33- - [ 五、常用消息队列] ( #五常用消息队列 )
34- - [ 5.1 ActiveMQ] ( #51-activemq )
35- - [ 5.2 RabbitMQ] ( #52-rabbitmq )
36- - [ 5.3 ZeroMQ] ( #53-zeromq )
37- - [ 5.4 Kafka] ( #54-kafka )
38- - [ 资料] ( #资料 )
17+ - [ 1. 消息队列应用场景] ( #1-消息队列应用场景 )
18+ - [ 1.1. 异步处理] ( #11-异步处理 )
19+ - [ 1.2. 应用解耦] ( #12-应用解耦 )
20+ - [ 1.3. 流量削锋] ( #13-流量削锋 )
21+ - [ 1.4. 日志处理] ( #14-日志处理 )
22+ - [ 1.5. 消息通讯] ( #15-消息通讯 )
23+ - [ 2. JMS 消息服务] ( #2-jms-消息服务 )
24+ - [ 2.1. 消息模型] ( #21-消息模型 )
25+ - [ 2.1.1. P2P 模式] ( #211-p2p-模式 )
26+ - [ 2.1.2. Pub/sub 模式] ( #212-pubsub-模式 )
27+ - [ 2.2. 消息消费] ( #22-消息消费 )
28+ - [ 2.3. JMS 编程模型] ( #23-jms-编程模型 )
29+ - [ 3. 常用 MQ 中间件] ( #3-常用-mq-中间件 )
30+ - [ 3.1. ActiveMQ] ( #31-activemq )
31+ - [ 3.2. RabbitMQ] ( #32-rabbitmq )
32+ - [ 3.3. ZeroMQ] ( #33-zeromq )
33+ - [ 3.4. Kafka] ( #34-kafka )
34+ - [ 4. MQ 示例] ( #4-mq-示例 )
35+ - [ 4.1. 电商系统] ( #41-电商系统 )
36+ - [ 4.2. 日志收集系统] ( #42-日志收集系统 )
37+ - [ 5. 资料] ( #5-资料 )
3938
4039<!-- /TOC -->
4140
42- ## 概述
41+ ## 1. 消息队列应用场景
4342
44- ### 消息队列应用场景
45-
46- #### 异步处理
43+ ### 1.1. 异步处理
4744
4845场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.并行方式。
4946
6764
6865按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是 50 毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是 50 毫秒。因此架构改变后,系统的吞吐量提高到每秒 20 QPS。比串行提高了 3 倍,比并行提高了两倍。
6966
70- #### 应用解耦
67+ ### 1.2. 应用解耦
7168
7269场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。如下图:
7370
8784- 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。
8885- 假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦。
8986
90- #### 流量削锋
87+ ### 1.3. 流量削锋
9188
9289流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。
9390
101981 . 用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面;
102992 . 秒杀业务根据消息队列中的请求信息,再做后续处理。
103100
104- #### 日志处理
101+ ### 1.4. 日志处理
105102
106103日志处理是指将消息队列用在日志处理中,比如 Kafka 的应用,解决大量日志传输的问题。架构简化如下:
107104
@@ -122,7 +119,7 @@ tags:
122119- Elasticsearch - 实时日志分析服务的核心技术,一个 schemaless,实时的数据存储服务,通过 index 组织数据,兼具强大的搜索和统计功能。
123120- Kibana - 基于 Elasticsearch 的数据可视化组件,超强的数据可视化能力是众多公司选择 ELK stack 的重要原因。
124121
125- #### 消息通讯
122+ ### 1.5. 消息通讯
126123
127124消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。
128125
@@ -140,43 +137,20 @@ tags:
140137
141138以上实际是消息队列的两种消息模式,点对点或发布订阅模式。模型为示意图,供参考。
142139
143- ## 消息中间件示例
144-
145- ### 电商系统
146-
147- ![ image] ( http://upload-images.jianshu.io/upload_images/3101171-1bbed6d1a2274ba1.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
148-
149- 消息队列采用高可用,可持久化的消息中间件。比如 Active MQ,Rabbit MQ,Rocket Mq。
150-
151- (1)应用将主干逻辑处理完成后,写入消息队列。消息发送是否成功可以开启消息的确认模式。(消息队列返回消息接收成功状态后,应用再返回,这样保障消息的完整性)
152-
153- (2)扩展流程(发短信,配送处理)订阅队列消息。采用推或拉的方式获取消息并处理。
154-
155- (3)消息将应用解耦的同时,带来了数据一致性问题,可以采用最终一致性方式解决。比如主数据写入数据库,扩展应用根据消息队列,并结合数据库方式实现基于消息队列的后续处理。
156-
157- ### 日志收集系统
158-
159- ![ image] ( http://upload-images.jianshu.io/upload_images/3101171-4275c9f0e9c8c463.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
160-
161- 分为 Zookeeper 注册中心,日志收集客户端,Kafka 集群和 Storm 集群(OtherApp)四部分组成。
162-
163- - Zookeeper 注册中心,提出负载均衡和地址查找服务;
164- - 日志收集客户端,用于采集应用系统的日志,并将数据推送到 kafka 队列;
165- - Kafka 集群:接收,路由,存储,转发等消息处理;
166-
167- Storm 集群:与 OtherApp 处于同一级别,采用拉的方式消费队列中的数据;
168-
169- ## JMS 消息服务
140+ ## 2. JMS 消息服务
170141
171- 讲消息队列就不得不提 JMS 。JMS(JAVA Message Service, java 消息服务)API 是一个消息服务的标准/规范,允许应用程序组件基于 JavaEE 平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。
142+ 讲消息队列就不得不提 JMS 。JMS(JAVA Message Service, java 消息服务)API 是一个消息服务的标准/规范,允许应用程序组件基于 JavaEE 平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。
172143
173144在 EJB 架构中,有消息 bean 可以无缝的与 JM 消息服务集成。在 J2EE 架构模式中,有消息服务者模式,用于实现消息与应用直接的解耦。
174145
175- ### 4.1 消息模型
146+ ### 2.1. 消息模型
176147
177- 在 JMS 标准中,有两种消息模型 P2P(Point to Point),Publish/Subscribe(Pub/Sub)。
148+ 在 JMS 标准中,有两种消息模型:
178149
179- #### P2P 模式
150+ - P2P(Point to Point)
151+ - Pub/Sub(Publish/Subscribe)
152+
153+ #### 2.1.1. P2P 模式
180154
181155![ image] ( http://upload-images.jianshu.io/upload_images/3101171-2adc66e2367cd2c2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
182156
@@ -190,7 +164,7 @@ P2P 的特点
190164
191165如果希望发送的每个消息都会被成功处理的话,那么需要 P2P 模式。
192166
193- #### Pub/sub 模式
167+ #### 2.1.2. Pub/sub 模式
194168
195169![ image] ( http://upload-images.jianshu.io/upload_images/3101171-12afe9581da889ea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
196170
@@ -206,23 +180,23 @@ Pub/Sub 的特点
206180
207181如果希望发送的消息可以不被做任何处理、或者只被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用 Pub/Sub 模型。
208182
209- ### 消息消费
183+ ### 2.2. 消息消费
210184
211185在 JMS 中,消息的产生和消费都是异步的。对于消费来说,JMS 的消息者可以通过两种方式来消费消息。
212186
213187(1)同步
214188
215189订阅者或接收者通过 receive 方法来接收消息,receive 方法在接收到消息之前(或超时之前)将一直阻塞;
216190
217- (2)异步
191+ (2)异步
218192
219193订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的 onMessage 方法。
220194
221195JNDI:Java 命名和目录接口,是一种标准的 Java 命名系统接口。可以在网络上查找和访问服务。通过指定一个资源名称,该名称对应于数据库或命名服务中的一个记录,同时返回资源连接建立所必须的信息。
222196
223197JNDI 在 JMS 中起到查找和访问发送目标或消息来源的作用。
224198
225- ### JMS 编程模型
199+ ### 2.3. JMS 编程模型
226200
227201(1) ConnectionFactory
228202
@@ -256,11 +230,11 @@ Session 是操作消息的接口。可以通过 session 创建生产者、消费
256230
257231深入学习 JMS 对掌握 JAVA 架构,EJB 架构有很好的帮助,消息中间件也是大型分布式系统必须的组件。本次分享主要做全局性介绍,具体的深入需要大家学习,实践,总结,领会。
258232
259- ## 常用消息队列
233+ ## 3. 常用 MQ 中间件
260234
261235一般商用的容器,比如 WebLogic,JBoss,都支持 JMS 标准,开发上很方便。但免费的比如 Tomcat,Jetty 等则需要使用第三方的消息中间件。本部分内容介绍常用的消息中间件(ActiveMQ、RabbitMQ、RocketMQ、Kafka)以及他们的特点。
262236
263- ### ActiveMQ
237+ ### 3.1. ActiveMQ
264238
265239ActiveMQ 是 Apache 出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持 JMS1.1 和 J2EE 1.4 规范的 JMS Provider 实现,尽管 JMS 规范出台已经是很久的事情了,但是 JMS 在当今的 J2EE 应用中间仍然扮演着特殊的地位。
266240
@@ -286,7 +260,7 @@ ActiveMQ 特性如下:
286260
287261⒑ 可以很容易得调用内嵌 JMS provider,进行测试
288262
289- ### RabbitMQ
263+ ### 3.2. RabbitMQ
290264
291265RabbitMQ 是流行的开源消息队列系统,用 erlang 语言开发。RabbitMQ 是 AMQP(高级消息队列协议)的标准实现。支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支持 AJAX,持久化。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
292266
@@ -328,7 +302,7 @@ channel:消息通道,在客户端的每个连接里,可建立多个 channe
328302
329303exchange 接收到消息后,就根据消息的 key 和已经设置的 binding,进行消息路由,将消息投递到一个或多个队列里。
330304
331- ### ZeroMQ
305+ ### 3.3. ZeroMQ
332306
333307号称史上最快的消息队列,它实际类似于 Socket 的一系列接口,他跟 Socket 的区别是:普通的 socket 是端到端的(1:1 的关系),而 ZMQ 却是可以 N:M 的关系,人们对 BSD 套接字的了解较多的是点对点的连接,点对点连接需要显式地建立连接、销毁连接、选择协议(TCP/UDP)和处理错误等,而 ZMQ 屏蔽了这些细节,让你的网络编程更为简单。ZMQ 用于 node 与 node 间的通信,node 可以是主机或者是进程。
334308
@@ -358,7 +332,7 @@ ZeroMQ 高性能设计要点:
358332
359333区别于传统的多线程并发模式,信号量或者临界区, zeroMQ 充分利用多核的优势,每个核绑定运行一个工作者线程,避免多线程之间的 CPU 切换开销。
360334
361- ### Kafka
335+ ### 3.4. Kafka
362336
363337Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像 Hadoop 的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka 的目的是通过 Hadoop 的并行加载机制来统一线上和离线的消息处理,也是为了通过集群机来提供实时的消费。
364338
@@ -397,8 +371,33 @@ Parition 是物理上的概念,每个 Topic 包含一个或多个 Partition.
397371
398372一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用。
399373
400- ## 资料
374+ ## 4. MQ 示例
375+
376+ ### 4.1. 电商系统
377+
378+ ![ image] ( http://upload-images.jianshu.io/upload_images/3101171-1bbed6d1a2274ba1.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
379+
380+ 消息队列采用高可用,可持久化的消息中间件。比如 Active MQ,Rabbit MQ,Rocket Mq。
381+
382+ (1)应用将主干逻辑处理完成后,写入消息队列。消息发送是否成功可以开启消息的确认模式。(消息队列返回消息接收成功状态后,应用再返回,这样保障消息的完整性)
383+
384+ (2)扩展流程(发短信,配送处理)订阅队列消息。采用推或拉的方式获取消息并处理。
385+
386+ (3)消息将应用解耦的同时,带来了数据一致性问题,可以采用最终一致性方式解决。比如主数据写入数据库,扩展应用根据消息队列,并结合数据库方式实现基于消息队列的后续处理。
387+
388+ ### 4.2. 日志收集系统
389+
390+ ![ image] ( http://upload-images.jianshu.io/upload_images/3101171-4275c9f0e9c8c463.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
391+
392+ 分为 Zookeeper 注册中心,日志收集客户端,Kafka 集群和 Storm 集群(OtherApp)四部分组成。
393+
394+ - Zookeeper 注册中心,提出负载均衡和地址查找服务;
395+ - 日志收集客户端,用于采集应用系统的日志,并将数据推送到 kafka 队列;
396+ - Kafka 集群:接收,路由,存储,转发等消息处理;
397+
398+ Storm 集群:与 OtherApp 处于同一级别,采用拉的方式消费队列中的数据;
401399
402- [ 大型网站架构系列:分布式消息队列(一) ] ( https://www.cnblogs.com/itfly8/p/5155983.html )
400+ ## 5. 资料
403401
404- [ 大型网站架构系列:消息队列(二)] ( https://www.cnblogs.com/itfly8/p/5156155.html )
402+ - [ 大型网站架构系列:分布式消息队列(一)] ( https://www.cnblogs.com/itfly8/p/5155983.html )
403+ - [ 大型网站架构系列:消息队列(二)] ( https://www.cnblogs.com/itfly8/p/5156155.html )
0 commit comments