常用的消息中间件
消息中间件是当前处理大数据的一个非常重要的组件,用来解决应用解耦、异步通信、流量控制等问题,从而构建一个高效、灵活、消息同步和异步传输处理、存储转发、可伸缩和最终一致性的稳定系统。目前业界应用比较多的分布式消息中间件主要包括:ActiveMQ、RabbitMQ、Kafka、RocketMQ,虽然都是分布式消息中间件,但是每种消息中间件使用方式区别还是很大的。
ActiveMQ
-
优点:Apache开源,功能集全,文档多,历史悠久,支持多语言客户端,使用简单。
-
缺点:性能比较低、只支持主从架构,扩展性差。
RabbitMQ
-
优点:用Erlang语言实现,性能比ActiveMQ高,功能丰富,支持协议多(AMQP、XMPP、SMTP)。
-
缺点:虽然性能比ActiveMQ好,但比Kafka、RocketMQ还是有差距,只支持主从方式。扩展性差
Kafka
-
优点:Apache开源,性能非常高,可靠性好,分布式扩展能力,支持多语言。
-
缺点:管理工具少,支持协议少
RocketMQ
- 优点:Apache开源,java语言实现,学习了Kafka的设计理念,继承了高性能、扩展性好。功能对企业应用支持比较好了,如定时消息。
kafka设计目标
以时间复杂度为O1的方式 提供消息持久化能力,即使对TB级的数据也能保证常数级时间的访问能力。
高吞吐率,即使在廉价的商用机器上,也能做单机10万条每秒的传输率。
支持消息分区,及分布式消费,保证每个分区的消息顺序消费
支持离线数据处理和实时数据处理
支持在线水平扩展
Kafka的特性
-
高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。
-
可扩展性:kafka集群支持热扩展
-
持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
-
容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
-
高并发:支持数千个客户端同时读写
应用场景
消息系统:
KafKa作为一个优秀的消息系统,具有高吞吐量、内置的分区、备份冗余分布式的特点,为大规模的消息处理提供了一种很好的解决方案;
应用监控:
利用KafKa收集应用程序和服务器健康相关指标,如CPU占用率、IO、内存、连接数、TPS、QPS等,然后将指标信息进行处理
流处理:
需要将已经收集的流数据,如系统的点击、浏览事件,提供给其他流式计算框架进行处理,Spark Stream, Storm Flink;
持久性日志:
KafKa可以为外部系统提供一种持久性日志的分布式系统。日志可以在多个节点之间进行备份
Kafka概念
-
Message(消息):一条数据,每条消息都有一个键和对应的一个值。
-
producer(生产者):将消息发布到 topics。Producer 决定向 topic 分区的发布方式
-
consumer(消费者):消息的订阅者
-
Consumer Group:consumer的逻辑组,一条消息,只能被同一个Consumer Group消费一次。
-
topic(主题):消息的分类。消费者通过订阅Topic来读取数据
-
partition(分区):一个topic至少一个分区,不同分区不保证消息的消费顺序。更多的分区意会着,更高吞吐能力。同时会打开更多的文件句柄。进程打开的文件句柄是目前Kafka系统的一大瓶颈。Kafka broker使用的是本地文件系统,这将会影响Kafka往流式架构发展,也许Kafka以后会支持分布式的文件系统。如MapR Stream.
-
Broker:Kafka 以分布式系统/集群方式运行。集群中的每个节点称一个 Broker,负责消息的持久化,可以横向扩展。
-
Replication:Kafka消息的备份,实现数据冗余,保障数据尽量不丢失;
-
Offset(偏移量):消息是存储在broker上的分区里
-
ISR(In-sync Replica):可用同步的副本列表,ISR
Kafka的创新
消息的持久化的时间:不再需要跟踪特定消息的读取情况,设定消息的保留时间。确保消息被读取之后再删除。
消费者可以自己管理消息偏移量offset,Kafka可以将消息存储在文件系统上,读取消息时就和读文件一样,可以顺序性的读消息。因此Kafka的处理消息的速度非常快。
Kafka的缺点
Topic和分区数量问题,Kafka在上万的topic面前,性能会非常低下。
手动均均衡分区负载,不能自动实现负载均衡
没有固定的序列化机制,如果大规模使用时,不一样的序列机制,就无法兼容通讯
镜像不足,Kafka只是简单把消息转发,生产者和消费者却不能转移过去
下一代的消息系统-MapR Stream
被称为下一代的消息系统,使用MapR平台的分布式文件系统,在存储上比KafKa更加强大。它的应用是在Kafka等消息队列都无法满足时,才考虑的一个消息系统。当前的架构都是请求响应型,无法满足现实生活的实时性,像当前的直播系统,或者其他实时的系统,对消息实时性有很高的要求,主是、数据量都很大时,Kafka消息队列可能也无法满足。