分布式消息:kafka、RabbitMQ、RocketMQ、Spring Cloud Stream
关于kafka、更好的跨平台支持、以及高效的处理速度、有种说法是:即使在普通的机子上也可以处理每秒十万条数据、
设计目标:
1、以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能
2、高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输
3、支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输
4、同时支持离线数据处理和实时数据处理
kafka架构:
如上图所示,一个典型的kafka集群中包含若干producer(可以是web前端产生的page view,或者是服务器日志,系统CPU、memory等),若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干consumer group,以及一个Zookeeper集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance。producer使用push模式将消息发布到broker,consumer使用pull模式从broker订阅并消费消息。
Push vs. Pull
作为一个messaging system,Kafka遵循了传统的方式,选择由producer向broker push消息并由consumer从broker pull消息。一些logging-centric system,比如Facebook的Scribe和Cloudera的Flume,采用非常不同的push模式。事实上,push模式和pull模式各有优劣。
push模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。push模式的目标是尽可能以最快速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据consumer的消费能力以适当的速率消费消息。
Topic & Partition
Topic在逻辑上可以被认为是一个queue。每条消费都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里。为了使得Kafka的吞吐率可以水平扩展,物理上把topic分成一个或多个partition,每个partition在物理上对应一个文件夹,该文件夹下存储这个partition的所有消息和索引文件。
kafka平台管理工具 Kafka Manager是Yahoo开源的Kafka管理工具。
它支持如下功能
1、管理多个集群
2、方便查看集群状态
3、执行preferred replica election
4、批量为多个Topic生成并执行Partition分配方案
5、创建Topic
6、删除Topic(只支持0.8.2及以上版本,同时要求在Broker中将delete.topic.enable设置为true)
7、为已有Topic添加Partition
8、更新Topic配置
9、在Broker JMX Reporter开启的前提下,轮询Broker级别和Topic级别的Metrics
10、监控Consumer Group及其消费状态
11、支持添加和查看LogKafka
抄袭地址:http://www.jasongj.com/2015/03/10/KafkaColumn1/
RabbitMQ :官方的技术亮点有很多、最显眼的就是多协议了吧、比别的支持的协议都多、支持持久化、也就防止消息丢失了、广泛的客户端、官方文档:只要是你能想到的编程语言几乎都有与其相适配的RabbitMQ客户端。
抄袭地址:http://rabbitmq.mr-ping.com/description.html
Rocket MQ:阿里开源
关键特性以及其实现原理:
一、顺序消息
二、消息重复
RocketMQ不保证消息不重复,如果你的业务需要保证严格的不重复消息,需要你自己在业务端去重。
三、事务消息
RocketMQ除了支持普通消息,顺序消息,另外还支持事务消息。首先讨论一下什么是事务消息以及支持事务消息的必要性。
四、Producer如何发送消息
Producer轮询某topic下的所有队列的方式来实现发送方的负载均衡,如下图所示:
五、消息存储
RocketMQ的消息存储是由consume queue和commit log配合完成的。
1、Consume Queue
consume queue是消息的逻辑队列,相当于字典的目录,用来指定消息在物理文件commit log上的位置。
我们可以在配置中指定consumequeue与commitlog存储的目录
每个topic下的每个queue都有一个对应的consumequeue文件,比如:
${rocketmq.home}/store/consumequeue/${topicName}/${queueId}/${fileName}
3、消息存储实现
4、消息的索引文件
六、消息订阅
RocketMQ消息订阅有两种模式,一种是Push模式,即MQServer主动向消费端推送;另外一种是Pull模式,即消费端在需要时,主动到MQServer拉取。但在具体实现时,Push和Pull模式都是采用消费端主动拉取的方式。