消息传送系统和kafka

转自https://blog.****.net/dapeng1995/article/details/81536862

一、面向消息的中间件(MOM)

1、中间件允许独立开发且运行于不同网络平台的软件组件彼此交互。在概念上,中间件位于应用程序层与平台层之间

2、分布于不同网络节点上的应用程序使用应用程序接口进行通信,而不必关心托管其他应用程序的操作环境的细节,也不必关心将它们连接到这些应用程序的服务。此外,通过提供管理接口,可以使用这个新的互联应用程序虚拟系统安全可靠,可以对性能进行度量和调整,也可以在不丢失任何功能的情况下进行扩展。

3、消息队列分类

点对点:消息生产者生产消息发送到queue中,然后消息消费者从queue中取出消息并且消费信息

消息被消费以后,队列中不再有存储,所以消息消费者不可能消费到已经被消费的信息。队列支持存在多个消费者,但是对于一个消费者而言,只有一个消费者可消费,是一个一对一的过程。

发布/订阅

消息生产者将消息发布到topic 中(发布),同时有多个消费者消费该消息(订阅)。是一个一对多的过程。

消息传送系统和kafka

二、kafk

1、kafka 是分布式发布-订阅消息系统,它最初由linkedin 公司开发,使用Scala语言编写,之后称为Apache项目的一部分。在kafka集群中,没有“中心主节点”的概念,集群中所有的服务器都是对等的,因此,可以在不做任何配置的更改的情况下实现服务器的添加与删除,同样的生产者和消费者也能做到随意重启和机器上下线。

消息传送系统和kafka

消息传送系统和kafka

 

2、kafka中的broker

broker即kafka的服务器,用户存储消息,kafka集群中的一台或者多台服务器统称为broker。

message 在broker中通过log追加的方式进行持久化存储,并进行分区(partition)

为了减少磁盘的写入次数,broker会将消息暂时buffer起来,当消息的个数达到一定的阈值的时候,在flush(用于写磁盘的线程)到磁盘这样减少了磁盘IO的调用次数

broker没有副本机制,一旦broker宕机,该broker的消息都将不可用,message消息有备份

broker不保存订阅者的状态,由订阅者自己保存。

broker不保存导致消息的删除称为难题(可能删除的消息正在被订阅),kafka基于时间的SLA(服务水平保证),消息保存一定时间(通常为7天)后会被删除。

订阅者可以回退到任意位置重新进行消费,当订阅者故障时,可以选择最小的offset(id)进行重新读取消费信息。

3、message

message是通信的基本单位。每个生产者可以向一个topic发布一些消息

kafka的message以topic为基本单位组织,不同的topic之间相互独立。每个topic又可以分为几个不同的partition(在创建时指定),每个partition存储一部分消息

partition中的每条消息包含了以下三个属性

offeset 消息的唯一标识

messagesize对应类型

data 是具体内容

4、partition分区

kafka基于文件保存。通过分区,可以将日志内容分散到多个server上,来避免文件尺寸达到单击磁盘的上限,每个partition都会被kafka实例保存

可以将一个topic切分成任意多的partition,从而提高消息保存、消费的效率

越多的partition意味着可以容纳更多的消费者,有效提升并发消费的能力

5、消费者分组:Group,用于归组同类消费者,在Kafka中,多个消费者可以共同消息一个Topic下的消息,每个消费者消费其中的部分消息,这些消费者就组成了一个分组,拥有同一个分组名称,通常也被称为消费者集群。

6、consumer

消息和数据消费者,订阅topic并处理其发布的消息的过程叫做consumer

在kafka中我们可以认为一个group是一个订阅者,一个topic中的每个partition,只会被一个订阅者zhong

 的一个consumer消费,一个consumer可以消费 多个partition中额消息。kafka的设计原理决定,对于统一个topic,同一个group中不能有多于parition个数的consumer同时消费,否则就意味着某些consumer无法得到消息

一个partition中的消息只会被group中的一个consumer消费,每个group中的consumer消息消费相互独立

7、kafka的持久化

一个topic可以认为是一类消息,每个topic可以分成多个partition,每个partition 在存储层面是append log文件,任何发布在此partition的消息都会被直接添加到log文件的尾部,每条消息在文件中的位置称为offset,partition是以文件的形式存储在文件系统中的

log文件根据broker的配置要求,保留一定时间后删除来释放磁盘空间(删除时同时会重新offset)

每隔一定字节的数据建立一条索引

8、通讯协议

采用自行设计基于TCP的协议,根据业务需要定制

kafka通讯的基 本单位是Request/Response

通讯过程: 

               客户端打开与服务器的套接字(socket)

               往socket 写入一个int32位的数字(表示请求的字节数)

              服务器端先读出一个int32的整数获得这次请求的大小,然后读取相应字节数从而获得请求内容

              服务器处理请求之后,以相同的方式来发送响应

9、数据传输的事务定义

at most once:发送一次,无论成功失败,将不会重发

at least once:消息至少发送一次,如果消息未能接受成功,可能会重发,直到接收成功

exactly once :消息只会发送一次