Kafka使用心得(1)—消息中间件
常见消息中间件
消息中间件是服务间传递消息的中间件,用于服务之间通信的。服务间通信可以分为两大类,一类是机器内的服务通信,一类是不同机器间的服务通信。
1. 机器内服务通信
项目间的服务通信,即进程或线程间的通信。这是一个面试或笔试经常会考的问题。进程间通信的常见方法有:管道、共享内存、信号量、消息队列等。
- 管道:分为匿名管道和命名管道,其中匿名管道只适用于父子进程间的通信,命名管道允许任意进程间的通信。
- 共享内存:内存分为用户态和内核态,内核态的内存是各个模块共享的,所以可以将消息写入高端内存进行共享
- 信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。
- 消息队列:内核内存在消息链表,产生消息后内核会自动调用对应的回调函数进行处理,进程可以向内核注册自己的消息,从而进行消息共享
2. 机器间的服务通信
机器间的服务通信相对复杂,一般使用常见的开源项目。比如RabbitMq,Redis,ZeroMQ,ActiveMq,Kafka,RoketMQ等。
2.1 RabbitMq
RabbitMq是一个非常重量级的消息中间件,支持的协议非常丰富,包括http、SMTP、AMQP等等,因此非常重量级。RabbitMq实现了broker架构,因此对负载均衡支持比较好,同时也实现了数据的持久化,在消息的可靠性,数据一致性,架构稳定性方面表现非常好。商业应用比较多。但是性能和吞吐量比较差。
2.2 Redis
Redis是一个轻量级的KV数据存储系统,也支持轻量级的MQ,但redis由于是单线程服务,在数据量较小的情况下,性能比RabbitMq要好,但是数据量大的时候性能较差。
2.3 ZeroMq
号称吞吐量最大,最快的消息队列。ZeroMq完全采用内存存储消息内容,非常适用于对吞吐量要求非常高的场景。ZeroMq非常独特,没有自己单独的服务器,使用的应用程序就是他的服务器。使用的时候只需要引入ZeroMq包,就可以发送消息,非常简单。缺点也很明显,由于不支持数据持久化,因此宕机后消息很容易丢失。Storm0.8以前的版本是使用ZeroMq。
2.4 ActiveMq
和ZeroMq类似,使用非常简单,支持消息代理和P2P模式,介于Rabbit和Zero之间。
2.4 Kafka
Kafka被称为下一代的消息中间件。和上面几位相比,优势非常明显。Kafka吞吐量非常高,支持消息持久化,负载均衡和灾备做的也很出色,而且对Java的支持最好。下面会详细介绍。
2.5 RoketMq
阿里最新的消息中间件,Metaq 3.0版本。经过查询,是阿里的开发看了Kafka的设计文档后,重新开发出来的,据说架构一模一样,唯一的不同是Kafka使用Scala编写,Metaq是使用Java编写。
上一篇: Kafka集群的部署与测试
下一篇: ActiveMQ高可用集群方案