消息引擎范型
消息引擎范型描述了消息引擎系统的两个不同的子部分是如何交互且连接的。如果将消息引擎系统的两个不同的子部分比喻成两座城市,那么传输协议将是两座城市之间需要铺设的沥青公路,而引擎范型决定了来往穿梭于这两座城市之间的路线。
最常见的两种消息引擎范型是消息队列模型和发布/订阅消息模型。
(1)消息队列模型是基于队列提供消息传输服务的,多用于进程间通信(IPC)以及线程间通信。该模型定义了消息队列(queue),发送者(sender)和接受者(receiver),提供了一种点对点(P2P)的消息传递方式,既发送者发送每条消息到队列的指定位置,接受者从指定位置获取消息。一旦消息被消费,就会从队列中移除该消息。每条消息由一个发送者生产出来,且只被一个消费者处理,发送者和消费者之间是一对一的关系。
(2)发布/订阅消息模型,有主题(topic)的概念:一个topic可以理解为逻语义相近的消息的容器。这种模型也定了类似于生产者和消费者的角色,即发布者(publisher)和订阅者(subscriber)。发布者将消息生产出来发送到指定的topic中,所有订阅了该topic的订阅者都可以接收到该topic下的所有消息。通常具有相同订阅topic的所有订阅者将接收到同样的消息。生活中报纸的订阅就是一种典型的发布/订阅模型。
Kafka同时支持这两种消息引擎模型。Kafka引入消息组的概念来同时支持这两种模型。
Java消息服务,即JMS。严格来说,它只是一套API规范,提供了很多接口用于实现分布式系统间的消息传递。
Kafka概要设计
1.吞吐量:是某种处理能力的最大值。
对kafka而言,它的吞吐量就是每秒能够处理的消息数或每秒能够处理的字节数。
2.延时:衡量一段时间间隔。
对kafka而言,延时可以表示客户端发起请求与服务器处理请求并发送响应给客户端之间的一段时间。
3.Kafka是如何做到高吞吐量、低延时?
Kafka的写操作是很快的,得益于他对磁盘的使用方法的不同。虽然kafka会持久化所有数据到磁盘,但本质上每次写入操作其实都只是把数据写入到操作系统的页缓存(不同于进程内部缓存)中,然后由操作系统自行决定什么时候把页缓存中的数据刷写到磁盘上。
优势:
(1)操作系统的页缓存是在内存中分配的,所系消息写入非常快
(2)Kafka不必直接与底层的文件系统打交道,所有的繁琐的I/O操作都交由操作系统来处理
(3)Kafka写入操作采用追加写入的方式,避免了磁盘随机写操作。(磁盘的顺序读写操作其实是非常快的,可以匹敌内存的随机读写速度)
Kafka在设计时采用追加写入消息的方式,即只能在日志文件末尾追加写入新的消息,且不允许修改已经写入的消息,因此他属于典型的磁盘顺序访问型操作,所以kafka消息发送的吞吐量是很高的。
Kafka把消息写入操作系统的页缓存,同样的,kafka在读取消息时会首先尝试从操作系统的页缓存中读数据,如果命中,便把消息经页缓存直接发送到网络的socket上。
4.Kafka消息持久化
Kafka是要持久化消息的,而且还要把消息持久化到磁盘上。这样做的好处如下:
Kafka实现持久化的设计也有新颖之处。普通的系统在实现持久化时可能会先尽量使用内存(进程内部缓存),当内存资源耗尽时,在一次性把数据“刷盘”,而kafka则反其道而行之,所有数据都会立即被写入文件系统的持久化日志中(先写入操作系统的页缓存,然后由操作系统自己进行刷盘操作),之后kafka服务器才会返回结果给客户端通知他们消息已被成功写入。这样做即实时保存了数据,有减少了kafka程序对于内存的消耗,从而将节省出的内存留给页缓存使用。更进一步地提升了整体性能。