ActiveMQ系列教程(二)两种消息模型
两种消息模型:点对点和发布订阅
1.P2P (点对点)模式
1)核心组件
消息队列(Queue)--消息存放的地方
发送者(Sender)--就是消息生产者
接收者(Receiver)--就是消息消费者
生产者生产的每个消息都被发送到一个特定的队列(queue),消费者从队列中获取消息。队列保留着(未被消费的)消息,直到他们被消费或超时。
2)P2P模式的特点
A. 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再留在消息队列中)
B. 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列;同时接受者也不用在线等待发送者发送,只要消息没被消费,随时都可以去取
C. 接收者在成功接收消息之后需向队列应答成功(acknowledge)
3)应用场景
如果你希望发送的每个消息必须且仅被消费一次的话,就可以使用P2P模式。以下举两个例子
A. 用户注册
不用消息队列场景
<!--5f39ae17-8c62-4a45-bc43-b32064c9388a:W3siYmxvY2tJZCI6IjEzOTAtMTU2MDg0Mjc3MzE1MCIsImJsb2NrVHlwZSI6ImltYWdlIiwic3R5bGVzIjp7IndpZHRoIjo2MjAsImhlaWdodCI6MSwiYWxpZ24iOiJsZWZ0IiwiZmxvYXQiOiJub25lIiwiYmFjay1jb2xvciI6IiIsInBhZGRpbmciOiIifSwidHlwZSI6ImltYWdlIiwic291cmNlIjoiaHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcmVzLzM0ODcxL0EyRUNDQzZEMzlBQTRDNUZBOEMxMEMxQzJBMUMzNUZEIiwidGl0bGUiOiIifV0=--> 可以看到,由于发送注册验证邮件是一个比较费时的操作,且与主要注册逻辑无关,也不需要实时响应,所以可以采用消息队列以异步形式进行处理,服务端完成注册信息插入操作后立即返回给客户端,无需等待注册邮件发送完成
B. 秒杀时流量削峰
同样的,秒杀成功后后面还有下单、付款、库存操作、优惠策略、发货等一系列过程,在高并发应用场景下,如果同步处理、响应是不可接受的,而是应该及时向客户端返回秒杀请求结果,然后大量秒杀请求消息进入消息队列随后慢慢处理。
2. Pub/Sub (发布与订阅)
类似于面向对象设计模式中的观察者模式
1)核心组件
主题(Topic)--相当于点对点中的队列
发布者(Publisher)--在特定主题上发布消息
订阅者(Subscriber) --订阅特定主题,接收消息
发布者将消息发送到主题(Topic),系统将这些消息传递给多个订阅者。
2)Pub/Sub的特点
A. 每个消息可以有多个消费者
B. 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,只能接收订阅后发布者发布的消息,不能接收到之前的消息(除非进行持久化订阅)。为了消费消息,订阅者必须保持运行的状态。
3)持久化消息
为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
4)应用场景
如果你希望发送的消息可以被多个消费者处理的话,那么可以采用Pub/Sub模型。比如新闻客户端订阅栏目一样,订阅了才给你推送,同样的消息可以推送给所有订阅人
2. 消息的同步和异步消费
对于消息消费来说,不管是P2P还是发布订阅模式,JMS的消费者可以通过同步或异步两种方式来消费消息。
○ 同步
订阅者(发布-订阅模式)或接收者(点对点)调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞
○ 异步
订阅者或接收者可以注册为一个消息监听器。在消息到来之前接收者或订阅者可以正常做别的事。当消息到达之后,系统自动调用监听器的onMessage方法(相当于事件驱动)
下一篇将介绍ActiveMQ安装和基本配置相关推荐
yaodilu 2020-05-10
SXIAOYI 2020-09-16
有心就有方向 2012-09-03
zfyaixue 2013-06-14
pigsmall 2020-11-19
Ladyseven 2020-07-25
whileinsist 2020-06-24
gufudhn 2020-06-12
冰蝶 2020-06-05
LinuxAndroidAI 2020-06-04
supperme 2020-05-28
e度空间 2020-04-27
云端漂移 2020-04-09
peterwzc 2020-03-17
ebuild 2013-05-14
donghedonghe 2013-05-31
tdeclipse 2011-02-28
linuxprobe0 2013-04-15