目录
消息队列:
应用解耦:
流量控制:
消息分发:
RocketMQ:
RocketMQ主要实现了哪些设计目标:
最近自己在看RocketMQ系列深入分析,准备把所看所想记录下来,省的到时候看完又忘了,连个温故而知新的地方都没有,好了,废话少说,开搞。
主要参考两本书,顺便给他们做个广告,哈哈。
《RocketMQ实战与原理解析》,相对来说通俗易懂,对入门确实还是有很大帮助,深入性不强。
《RocketMQ技术内幕》,更偏向于原理及源码解析,有一定的层次深入,相对会吃力一些,可能是我比较菜的缘故。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
在数据结构里类似我们学习的队列,先进先出的原则。我最早认知到消息队列还是参与EDI相关工作的时候,用到ActiveMQ,IBMMQ,以及kafka,才认识了消息队列。消息队列的产生也是在大型互联网服务架构里应对应用解耦,流量控制,消息分发等背景下产生的,这种中间件技术也逐渐成为标配,尤其是随着微服务,微架构兴起,所以同时也要求消息队列要高可用,高质量,高效率。
总之,消息队列----->高可用,解耦应用,流量控制,分发数据。
以我们常见的电商平台为例,以前从下单到支付,到物流,到结算,都在同一个系统,而且串行运行,一旦某个节点环节出现问题,直接导致整个系统不可用。加入消息队列后,下单系统-----支付系统----物流系统----结算系统,之间的交互通过消息队列完成,某个服务出现问题,仅仅当前服务不可用,其他依然正常操作,提升系统可用性和体验度。
比如常见的秒杀活动,如果瞬间把应用所有请求放入,会导致系统瞬间访问暴增,难以及时处理,甚至卡死瘫痪,加入消息队列做缓冲后,请求进入队列等待,系统正常处理队列的消息,超过的请求队列也不再接收,从而保证了系统稳定性。
数据时代,数据就是财富,数据挖掘,数据分析,数据学习,更是离不开数据,所以在很多业务场景下,往往需要把处理的数据分发给很多需要的下游,或者消费者,这时通过消息队列的持久化,有需要的消费者根据各自的需求订阅相关的消息,再去处理,各自直接互不影响,从而完成消息的向下分发。
来源于阿里的开源消息中间件,现已成为Apache的顶级开源项目,基于java语言开发。
1、架构模式:
消息生产者,消息存储,消息消费者,路由发现。
2、消息顺序:
保证了消息的先进先出,有序消费。
3、消息过滤:
生产者(服务端)和消费者(客户端)可以按需对消息过滤。
4、消息存储:
消息堆积能力和消息存储能力。通过引入内存映射机制,而且按照顺序存储在同一个文件,还有文件的过期机制和空间报警机制,提升消息的存储高性能。
5、消息高可用:
根据不同情况,提供不同的刷盘机制,集群模式,数据同步机制等保障高可用。
6、消息消费高效性:
尽量保证消息在不堆积情况下,实时推送(长轮询模式)。
7、确保消息至少消费一次:
ACK机制保证消息至少消费一次,可能重复消费,但至少保证不丢失消息消费。
8、回溯消息:
比如重新消费,重发,可以在控制台移动消息指针或者对某个消息重发,重新消费。
9、消息堆积:
流量控制。消费者性能弱于生产者时,生产的速度会导致待消费的消息不断增加,MQ具备一定的堆积能力。默认保留3天,可配置。
10、定时消息:
消费端定时消费生产的消息。
11、消息重试机制:
消费时如果发生异常,会对消息进行重新投递,也就是MQ的重试机制,最终重试失败的会默认放到死性队列DLQ中去。
一下来自官网介绍,比较三个消息队列:
The table below is a handy quick reference for spotting the differences among RocketMQ and its most popular alternatives at a glance.
Messaging Product | Client SDK | Protocol and Specification | Ordered Message | Scheduled Message | Batched Message | BroadCast Message | Message Filter | Server Triggered Redelivery | Message Storage | Message Retroactive | Message Priority | High Availability and Failover | Message Track | Configuration | Management and Operation Tools |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ActiveMQ | Java, .NET, C++ etc. | Push model, support OpenWire, STOMP, AMQP, MQTT, JMS | Exclusive Consumer or Exclusive Queues can ensure ordering | Supported | Not Supported | Supported | Supported | Not Supported | Supports very fast persistence using JDBC along with a high performance journal,such as levelDB, kahaDB | Supported | Supported | Supported, depending on storage,if using kahadb it requires a ZooKeeper server | Not Supported | The default configuration is low level, user need to optimize the configuration parameters | Supported |
Kafka | Java, Scala etc. | Pull model, support TCP | Ensure ordering of messages within a partition | Not Supported | Supported, with async producer | Not Supported | Supported, you can use Kafka Streams to filter messages | Not Supported | High performance file storage | Supported offset indicate | Not Supported | Supported, requires a ZooKeeper server | Not Supported | Kafka uses key-value pairs format for configuration. These values can be supplied either from a file or programmatically. | Supported, use terminal command to expose core metrics |
RocketMQ | Java, C++, Go | Pull model, support TCP, JMS, OpenMessaging | Ensure strict ordering of messages,and can scale out gracefully | Supported | Supported, with sync mode to avoid message loss | Supported | Supported, property filter expressions based on SQL92 | Supported | High performance and low latency file storage | Supported timestamp and offset two indicates | Not Supported | Supported, Master-Slave model, without another kit | Supported | Work out of box,user only need to pay attention to a few configurations | Supported, rich web and terminal command to expose core metrics |
Updated: December 17, 2016
这一篇主要是认知了消息队列和RocketMQ,其他的消息队列比如ActiveMQ,RabbitMQ,IBMMQ,kafka等等。
下一篇介绍下RocketMQ相关的代码,简单环境搭建运行,生产环境配置等。