欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Kafka使用心得(1)—消息中间件

程序员文章站 2022-07-13 15:44:31
...

常见消息中间件

 

消息中间件是服务间传递消息的中间件,用于服务之间通信的。服务间通信可以分为两大类,一类是机器内的服务通信,一类是不同机器间的服务通信。


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编写。