2一个典型的 Kafka 体系架构包括若干 Producer、若干 Broker、若干 Consumer,以及一个ZooKeeper集群。
3Producer:生产者,消息发送方。
4Consumer:消费者,消息接收方,针对消息做业务处理。
5Broker:服务代理节点,实际是Kafka服务器实例,接收Producer发送的消息,再把消息转发给Consumer。
6Zookeeper,控制Producer向哪个Broker发送消息以及Consumer从哪个Broker接收消息。
7发送的消息又有几个重要概念,Topic主题,Partition分区。
8Topic主题,一个逻辑概念,每条消息必须有且只有一个主题。
9Partition分区:在同一个主题下,可以设置一个或者多个分区,来增加消息处理的并发度。另外注意一个消息在同一个分区内是有序的,但是如果并发下发送消息,多个分区的消息顺序无法保证。
10分区副本:分区如果设置了多副本,提升了容灾能力,则同时会有Leader副本处理消息读写请求,follower副本负责同步leader副本的消息,如果leader副本出现问题,则会选择一个follower副本成为新的leader副本。一般情况下,副本不在同一个Broker中处理,但是如果有三个Broker,但是设置了4个副本,那么肯定是有2个副本在同一个Broker中的,实际这种设计意义不大。
1基于AMQP(Advanced Messaging Queuing Protocol)高级消息队列协议
2一个典型的 RabbitMQ体系架构(这些实际也是AMQP的设计)包括Publisher、Message、Exchange、Binding、Consumer、Queue、Broker。
3Producer:生产者,消息发送方。
4Message:具体的发送的消息内容,包括消息头和消息体。
5Exchange:交换器,用来接收生产者发送的消息,并把消息路由给服务器中的队列。
6Binding:绑定交换器和队列。就是决定交换器过来的消息发送到哪个队列。
6Queue:消息队列,用来保存消息直到发送给消费者,消息的容器,一个消息进入队列后,一直等待直到消息被取走。
7Consumer:消费者,从消息队列中取出消息。
8Broker:服务代理节点,实际是RabbitMQ服务器实例。
9Exchange又分为四类:direct,交换器通过消息的routing key判断,如果与Binding的binding key一致,交换器就将消息发送到对应的队列;fanout,消息发送到所有交换器绑定的队列上去,类似于广播;topic,这种是通过某些规则匹配到不同的队列中,比如routing key是cntest和cnuat,bingding key规则为cn#的队列就可以收到两个消息,bingding key为#test的队列就只能收到routing key为cntest的消息;header用的很少,有两种,完全匹配和匹配任意,也就是header中key value都匹配的队列才可以收到或者任意key value匹配就可以收到消息。
10为了保证消息的可靠性,可以设置queue,exchange, message持久化到磁盘,但是有时候需要先存储到cache,一段时间后才写入到磁盘中。
1使用方面,在java项目中Kafka需要单独引用kafka的maven包,而RabbitMQ由于基于AMQP协议,Springboot直接引入spring-boot-starter-amqp这个包即可,不用单独引用RabbitMQ的包,任何符合AMQP协议的消息中间件都可以通过spring-boot-starter-amqp使用。
2消息类型方面,RabbitMQ的支持四种复杂的类型,direct,fanout,topic和header模式。Kafka只能通过Topic和partition来控制消息的发送类型。
3服务器方面,RabbitMQ单独安装或者集群安装即可,不需要再安装其他组件,Kafka则需要Zookeeper配合使用,Producer和Consumer才能找到对应的Broker。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)