最近在研究消息中间件kafka,下面简单介绍一下kafka消息系统,首先,为什么使用消息中间件,有哪些消息中间件,为什么选择kafka
为什么使用消息系统?
1.首先就是消息系统的高性能,即使是非常普通的硬件可以支撑一秒几十万的消息
2.消息队列对应用之间进行了解耦,应用之间不存在强依赖
3.消息队列可以对消息数据进行持久化,这样即使处理消息的进程全部挂掉,也不会丢失已经加入消息队列的数据,对很多关键的业务来说,规避数据丢失的风险是至关重要的
4.由于消息队列对应用之间进行了解耦,这也大大的增加了系统的可扩展性,从消息的产出和消息的消费
5.应对突发高并发流量,在访问量剧增的情况下,使用消息队列把请求进行缓冲和筛选,防止突发流量冲击后端接口,导致应用超时或是直接拒绝服务
6.使用消息队列可以在一定程度上保证数据的顺序性
那么有哪些消息中间件呢?
现在比较流行的MQ有:ActiveMQ,kafka,RabbitMQ,Redis,jafka,ZeroMQ
值得一提的是Redis作为基于key-value的NoSQL数据库,也可以作消息队列,并且完全可以作为一个轻量级的队列服务器来使用;除此之外,AMQ,RabbitMQ,ZeroMQ都是相对比较重量级的消息系统,尤其是ZeroMQ,虽然称作是最快的消息队列系统,但是复杂的配置和技术框架让很多开发者望而却步;然而kafka和jafka,作为一个高性能跨语言分布式发布/订阅消息队列系统,在具有以上消息系统的所有优点之外,在量级上相对于AMQ之类来说也是非常轻量级的。
为什么选择kafka?
kafka的优势如下:
1.可靠性,kafka的partition机制和replication机制,容错机制使消息的传递有着很高的可靠性
2.kafka支持集群规模的热扩展
3.kafka的高性能,在数据的发布和订阅过程中,都能够保证数据的高吞吐量,即使在TB的数据存储情况下,仍然表现出很好的稳定性
4.kafka的消息状态由consumer处理,可以根据重设offset实现消息的重复消费(这个也是我在做任务调度的时候,选择kafka的原因)
kafka架构简介
kafka可以实现两种类型的消息传递:点对点(单播),和订阅/发布(广播)
点对点:看字面意思,就是消息由一个点传递到另一个点,也确实是这样子的,消息生产者生产消息并且发送到queue中,然后消费者从队列中取出消息进行消费,但是需要注意的是,queue虽然有可能存在多个消费者,但是对于一个消息,只能被一个消费者消费到。
订阅/发布:这个更好理解了,就像散布消息那样,消息生产者把消息发布到topic,如果同时有多个消费者订阅了该消息,那么发布到topic的消息会被所有的订阅的消费者消费
首先先来看下kafka的系统架构,然后再来解释一下kafka是如何实现这两种消息传递模式的。
producer:消息的生产者,就是向kafka broker push消息的客户端
consumer: 消息的消费者,从 kafka broker pull 消息的客户端
broker:就是 kafka服务器,一台kafka服务器就是一个broker,一个集群由多个broker组成,一个broker可以容纳多个 topic
topic & partition:topic在逻辑上可以认为是一个queue,每条消费都必须指定它的topic,可以简单理解必须指明把这条消息放到哪个queue里面,为了使得kafka的吞吐量可以得到线性的提升,物理机把topic分为了一个或则是多个partition
在这里有必要说一下 consumer group,根据consumer group的不同实现,可以实现消息传递的单播还是广播。