消息中间件ActiveMQ
消息中间件ActiveMQ
1、什么是ActiveMQ
一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的,可扩展的,稳定的和安全的企业级消息通信。
两种数据结构:
Queue(队列):生产者生产了一个消息,只能有一个消费者消费
Topic(主题):生产者生产了一个消息,可以被多个消费者消费(一对多)
2、ActiveMQ的作用以及原理
作用是系统之间进行通信,当然可以使用其它方式进行系统通信,如果使用ActiveMQ的话可以对系统之间的调用进行解耦,实现系统间的异步通信。原理是生产者生产消息,把消息发送给activemq,ActiveMQ接收到消息,然后查看又少个消费者,然后把消息转发给消费者,此过程中生产者无需参与。消费者接收到消息后做相应的处理和生产者没有任何关系。
3、几种通信方式
publish(发布) – subscribe(订阅)(发布订阅模式)
发布/订阅方式用于多接收客户端的方式,作为发布订阅的方式,可能存在多个接收客户端,并且接收端客户端与发送端客户端存在时间上的依赖,一个接收端只能接收它创建以后发送客户端发送的信息。
p2p(point-to-point)(点对点)
好比两个人打电话,两人独享这一段通信链路,一方发送,另一发接收。
p-p(点对点)方式的处理
点对点模式的话,如果消息发送不成功此消息默认会保存到activemq服务端直到有消费者将其消费,所以此时消息是不会丢失的。
4、如何解决消息重复问题
业务端的表记录已经处理消息的id,每次一个消息进来之前先判断消息是否执行过,如果执行过就放弃,如果没有执行就开始执行消息,消息执行完之后存入这个消息的id
5、消息通信的基本方式
同步方式
两个通信应用服务之间必须要进行同步,两个服务之间必须都是正常运行的,发送程序和接收程序都必须一直处于运行状态,并随时做好相互通信准备。
异步方式
两个通信应用之间可以不用同时在线等待,任何一方只需各自处理自己的业务,发送方和接收方是相互独立的。
6、ActiveMQ如何调优
使用非持久化消息
需要确保消息发送成功时使用事务来将消息分批组合
7、持久化消息非常慢
默认的情况下,非持久化的消息是异步发送的,持久化的消息是同步发送的,遇到慢一点的硬盘,发送消息的速度是无法忍受的。但是在开启事务的情况下,消息都是异步发送的,效率会有2个数量级的提升。所以在发送持久化消息时,请务必开启事务模式。其实发送非持久化消息时也建议开启事务,因为根本不会影响性能。
8、消息的不均匀消费
消费者去获取消息时,不会一条条去获取,而是一次性获取一批
解决方案:
每次处理 1条消息,处理完再去取,这样也慢了很多
9、优点
降低系统间模块的耦合度
解耦
软件扩展
10、消息丢失 怎么办
解决方案:用持久化消息(可以使用对数据进行持久化JDBC,AMQ(日志文件),或者非持久
消息化 消息及时处理不要堆积,或者启动事务,启动事务后,commit()方法会负责的等待服务器的返回 ,也就不会关闭连接导致消息丢失了
11、Queue和Topic的区别
点对点(point-to-point)PTP Queue消息传递模型
消息生产者知道消息消费者的队列并直接将消息发送到消息消费者的队列,这种模型的特点是能够保证数据安全
发布/订阅(publish/subscribe)Topic消息传递模型
一个消息发布者向一个特定的消息主题发布消息,0或多个对此消息主题感兴趣的并且处于活动状态的消息订阅者建立了持久订阅的消息订阅者才可以接受到所发布的消息,可能造成数据丢失
12、应用场景
异步处理
场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种1.串行的方式;2.并行方式。
(1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端。
(2)并行方式:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。
应用解耦
场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。
传统模式的缺点:
1) 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败;
2) 订单系统与库存系统耦合;
如何解决以上问题呢?引入应用消息队列后的方案,如下图:
1:订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功,请等待物流配送。
2:库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。
3:假如:在下单时库存系统不能正常使用。也不影响正常下单,
因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦。
流量削峰
流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。
应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用容易挂掉。为解决这个问题,一般需要在应用前端加入消息队列。
可以控制活动的人数.
可以缓解短时间内高流量压垮应用;
用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面;
秒杀业务根据消息队列中的请求信息,再做后续处理。
消息通讯
消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。
点对点通讯:
客户端A和客户端B使用同一队列,进行消息通讯。
聊天室通讯:
客户端A,客户端B,客户端N订阅同一主题,进行消息发布和接收。实现类似聊天室效果。
以上实际是消息队列的两种消息模式,点对点或发布订阅模式。
下一篇: PHP文件指针操作