消息队列概述
消息队列是系统中重要的中间件,主要解决应用耦合,异步消息,高并发等问题。实现高性能,高可用,可伸缩和最终一致性架构。
应用场景
异步处理场景
在串行模式中,用户注册成功写入数据库之后,会发站内信,然后发短信通知。串行处理任务完成Respose给用户。
在并行模式中,用户注册成之后写入数据库之后,将发站内信、短信的任务写入消息队列中,供其他系统的去读取处理。
业务解耦场景
在系统间引入MQ可以降低系统的耦合度,提高系统的高可用。
高并发场景
面对高并发请求,引入MQ,可以控制请求人数,缓解短时间高流量搞垮系统
JMS消息服务
JMS消息模型
P2P模型
每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
接收者在成功接收消息之后需向队列应答成功
Pub/Sub模式
每个消息可以有多个消费者
发布者和订阅者之间有时间上的依赖性。针对某个主题的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。
为了消费消息,订阅者必须保持运行的状态。
常用的MQ
ActiveMQ
⒈ 多种语言和协议编写客户端。
语言: Java,C,C++,C#,Ruby,Perl,Python,PHP。
应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
⒉ 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
⒊ 对Spring的支持
⒋ 通过了常见J2EE服务器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的测试,其中通 过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
⒌ 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
⒍ 支持通过JDBC和journal提供高速的消息持久化
⒎ 从设计上保证了高性能的集群,客户端-服务器,点对点
⒏ 支持Ajax
⒐ 支持与Axis的整合
⒑ 可以很容易得调用内嵌JMS provider,进行测试
RabbitMQ
用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
Kafka
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。即使是非常普通的硬件Kafka也可以支持每秒数百万的消息。一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用。