消息队列
Kafka消息队列

Apache Kafka一、概念描述1、1 消息队列1.消息队列已经成为企业系统内部的核心通信手段,它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。
2.它是类似于数据库一样需要独立部署在服务器上的一种应用,提供接口给其他系统调用。
3.消息中间件是遵守JMS(java message service)规范的一种软件(大多数消息中间件遵守JMS规范)。
要使用Java消息服务,你必须要有一个JMS提供者,管理会话和队列。
现在既有开源的提供者也有专有的提供者。
开源的提供者包括:Apache Active MQ、Kafka、Web Methods、阿里的Rocket MQ等。
1、2 什么是Kafka1.Apache Kafka是消息中间件的一种。
2.Kafka是一个分布式的、可分区的、可复制的消息系统。
1、3名词解析1.producer:生产者,生产“消息”。
2.consumer:消费者,消费“消息”。
3.topic:你把它理解为标签,生产者每生产出来一个“消息”就贴上一个标签(topic),消费者可不是谁生产的“消息”都消费,这样不同的生产者生产出来的“消息”,消费者就可以选择性的“消费”了。
4.broker:就是消息存储器。
二、Kafka安装1、Kafka 下载2、上传centos8 ,并解压1.[root@localhost home]# ll2.总用量 1107443.drwxr-xr-x. 2 root root 103 10月 26 21:56 app4.drwxr-xr-x. 3 root root 24 10月 25 00:10 dockerApache5.drwxr-xr-x. 2 root root 6 12月 4 2022 jdk6.-rw-r--r--. 1 root root 113400977 11月 4 20:51 kafka_2.12-3.6.0.tgz7.[root@localhost home]# clear8.[root@localhost home]# ll9.总用量 11074410.drwxr-xr-x. 2 root root 103 10月 26 21:56 app11.drwxr-xr-x. 3 root root 24 10月 25 00:10 dockerApache12.drwxr-xr-x. 2 root root 6 12月 4 2022 jdk13.-rw-r--r--. 1 root root 113400977 11月 4 20:51 kafka_2.12-3.6.0.tgz14.[root@localhost home]# tar -zxvf kafka_2.12-3.6.0.tgz15.kafka_2.12-3.6.0/3、启动zookeeper1.-rw-r--r--. 1 root root 28184 9月 29 00:56 NOTICE2.drwxr-xr-x. 2 root root 44 9月 29 01:00 site-docs3.[root@localhost kafka_2.12-3.6.0]# ./bin/zookeeper-server-start.sh -daemon config/zookeeper.properties &4.[1] 18665.[root@localhost kafka_2.12-3.6.0]#4、启动Kafka1.[root@localhost kafka_2.12-3.6.0]# ./bin/zookeeper-server-start.sh -daemon config/zookeeper.properties &2.[1] 18663.[root@localhost kafka_2.12-3.6.0]# ./bin/kafka-server-start.sh -daemon config/server.properties &4.[2] 22625.[1] 已完成 ./bin/zookeeper-server-start.sh -daemon config/zookeeper.properties6.[root@localhost kafka_2.12-3.6.0]#三、Kafka 使用测试5、创建一个topics1.[root@localhost kafka_2.12-3.6.0]# bin/kafka-topics.sh --bootstrap-server localhost:9092 --create--topic test1 --partitions 2 --replication-factor 12.Created topic test1.3.[root@localhost kafka_2.12-3.6.0]#6、查看当前话题1.[root@localhost kafka_2.12-3.6.0]# ./bin/kafka-topics.sh --list --bootstrap-server localhost:90922.test13.[root@localhost kafka_2.12-3.6.0]#7、生产消息Ctr+c结束1.[root@localhost kafka_2.12-3.6.0]# ./bin/kafka-console-producer.sh --topic quickstart-events --bootstrap-server localhost:90922.>my name is even8、消费消息1.[root@localhost kafka_2.12-3.6.0]# ./bin/kafka-console-consumer.sh --topic quickstart-events --from-beginning --bootstrap-server localhost:90922.my name is even9、关闭Kafka1.[root@localhost bin]# ./kafka-server-stop.sh2.[root@localhost bin]# ./zookeeper-server-stop.sh四、Java连接测试4、1 创建生成者1、创建一个Spring Boot项目Spring Boot 整合Kafka1.<dependency>2. <groupId>org.springframework.kafka</groupId>3. <artifactId>spring-kafka</artifactId>4.</dependency>2、在配置文件中加入配置1.server.port=99922. ###########【Kafka集群】###########3.spring.kafka.bootstrap-servers=localhost:90924. #==================================【初始化生产者配置】==================================#5. # 重试次数6.spring.kafka.producer.retries=07. # 应答级别:多少个分区副本备份完成时向生产者发送ack确认(可选0、1、all/-1)8.spring.kafka.producer.acks=19. # 批量大小10.spring.kafka.producer.batch-size=1638411. # 提交延时12.spring.kafka.producer.properties.linger.ms=013. # 当生产端积累的消息达到batch-size或接收到消息linger.ms后,生产者就会将消息提交给kafka14. # linger.ms为0表示每接收到一条消息就提交给kafka,这时候batch-size其实就没用了15. # 生产端缓冲区大小16.spring.kafka.producer.buffer-memory = 3355443217. # Kafka提供的序列化和反序列化类18.spring.kafka.producer.key-serializer=mon.serialization.StringSerializer19.spring.kafka.producer.value-serializer=mon.serialization.StringSerializer20.# 自定义分区器21.#spring.kafka.producer.properties.partitioner.class=com.felix.kafka.producer.CustomizePartitioner3、编写测试代码1.@Component2.public class KafkaProducer {3. @Autowired4.private KafkaTemplate<String,String> kafkaTemplate;5./**6. * 发送消息7. */8.public void sendMessage() {9.try{10.//生产消息11. String message = "ruoYi !测试ruoYi ";12. ListenableFuture<SendResult<String, String>> listenableFuture = kafkaTemplate.send("ruoYi", message);13. listenableFuture.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {14. @Override15.public void onSuccess(SendResult<String, String> result) {16. System.out.println("sendMessage success");17. }18. @Override19.public void onFailure(Throwable ex) {20. System.out.println("sendMessage error");21. }22. });23. }catch (Exception e){24. System.out.println("sendMessage exception");25. }26.}27.}4、发起测试1.@Autowired2.private KafkaProducer kafkaProducer;3.@RequestMapping("/hello")4.public String hello(){5. System.out.println("------->测试生产者发送消息");6. kafkaProducer.sendMessage();7.return"kafka消息已发送.";8.}5、查看Kafka 是否发送成功(若无法发送成功,可以尝试关闭防火墙)6、常见备注kafka报错:Connection to node 1 (localhost/127.0.0.1:9092) could not be established.原因:没有在kafka的config/server.properties文件中配置listeners=PLAINTEXT:IP地址:9092如果不配置具体IP地址,则默认使用localhost,不在kafka所在的机器上连接时就会报上述错误,因为kafka在zookeeper中注册时使用的localhost。
消息队列的概念

消息队列的概念
消息队列是一种用于在不同应用程序之间传递消息的技术。
它是一种分布式系统中的重要组件,可以让应用程序能够异步地通信,提高了系统的可靠性和可扩展性。
消息队列由消息处理器、消息发送器和消息接收器组成。
发送消息的应用程序将消息发送到队列中,然后消息处理器负责从队列中获取消息并将其传递给接收器。
接收器将消息处理完成后,再将处理后的结果发送回队列中。
消息队列可以解决分布式系统中的多种问题,例如:
- 异步通信:通过使用消息队列,发送方无需等待接收方的响应即可继续执行其他任务。
- 负载均衡:将任务分发到多个应用程序中,并通过队列平衡负载。
- 冗余备份:通过在多个应用程序中保存消息的备份,提高系统的可靠性。
- 消息持久化:通过将消息存储在队列中,即使应用程序宕机,也不会丢失任何消息。
总之,消息队列是一种可靠、高效、异步的通信机制,可以帮助应用程序实现可
扩展性和高可靠性。
消息队列简介-原理与应用

消息队列简介-原理与应⽤⼀、消息队列概述消息队列中间件是分布式系统中重要的组件,主要解决应⽤解耦,异步消息,流量削锋等问题,实现⾼性能,⾼可⽤,可伸缩和最终⼀致性架构。
⽬前使⽤较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ典型的:Kafka==》发布订阅系统参考:⼆、消息队列应⽤场景以下介绍消息队列在实际应⽤中常⽤的使⽤场景。
异步处理,应⽤解耦,流量削锋和消息通讯四个场景。
2.1异步处理场景说明:⽤户注册后,需要发注册邮件和注册短信。
传统的做法有两种 1.串⾏的⽅式;2.并⾏⽅式a、串⾏⽅式:将注册信息写⼊数据库成功后,发送注册邮件,再发送注册短信。
以上三个任务全部完成后,返回给客户端。
b、并⾏⽅式:将注册信息写⼊数据库成功后,发送注册邮件的同时,发送注册短信。
以上三个任务完成后,返回给客户端。
与串⾏的差别是,并⾏的⽅式可以提⾼处理的时间假设三个业务节点每个使⽤50毫秒钟,不考虑⽹络等其他开销,则串⾏⽅式的时间是150毫秒,并⾏的时间可能是100毫秒。
因为CPU在单位时间内处理的请求数是⼀定的,假设CPU1秒内吞吐量是100次。
则串⾏⽅式1秒内CPU可处理的请求量是7次(1000/150)。
并⾏⽅式处理的请求量是10次(1000/100)⼩结:如以上案例描述,传统的⽅式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。
如何解决这个问题呢?引⼊消息队列,将不是必须的业务逻辑,异步处理。
改造后的架构如下:按照以上约定,⽤户的响应时间相当于是注册信息写⼊数据库的时间,也就是50毫秒。
注册邮件,发送短信写⼊消息队列后,直接返回,因此写⼊消息队列的速度很快,基本可以忽略,因此⽤户的响应时间可能是50毫秒。
因此架构改变后,系统的吞吐量提⾼到每秒20 QPS。
⽐串⾏提⾼了3倍,⽐并⾏提⾼了两倍。
2.2应⽤解耦场景说明:⽤户下单后,订单系统需要通知库存系统。
消息队列介绍及原理

消息队列介绍及原理消息队列(Message Queue)是一种进程间通信的方式,通过消息的方式进行数据传输和交互。
它将消息按照一定的顺序存放在队列中,接收方可以按照一定的规则从队列中取出消息进行处理。
消息队列常用于分布式系统或异步处理的场景中,它能够实现异步解耦、削峰填谷、异步处理等功能。
同时,消息队列还具有高可用、可靠性强等特点,使得它成为了当前分布式系统中不可或缺的重要组件。
下面将介绍消息队列的原理及其基本特点。
一、消息队列的基本原理消息队列的基本原理可以归纳为三个关键组成部分:生产者、队列和消费者。
1. 生产者(Producer):消息的生产者负责将需要传递的消息发送到队列中。
生产者只负责把消息发送到队列,不需要知道消息被谁接收。
2. 队列(Queue):消息队列是消息传递的媒介,它负责存储所有发送过来的消息。
消息队列通常是基于先进先出(FIFO)原则进行消息的存储和处理。
3. 消费者(Consumer):消费者从队列中获取消息并进行处理。
消费者需要从消息队列中主动获取消息,因此消费者和队列之间是解耦的。
消息队列的基本原理可以表示为:生产者将消息发送到队列,消费者从队列中获取消息进行处理。
生产者和消费者之间通过消息队列实现了解耦,生产者和消费者之间并不直接通信。
二、消息队列的基本特点消息队列具有以下的基本特点,使得它成为了一种重要的分布式系统通信方式。
1.异步解耦:生产者和消费者之间通过消息队列进行通信,生产者发送消息后即可继续其他逻辑处理,而不需要等待消费者的处理结果。
这样能够实现异步解耦,提高系统的响应速度和吞吐量。
2.削峰填谷:队列作为中间媒介,能够将消息暂时存储起来。
当消费者无法及时处理消息时,消息可以在队列中排队等待处理。
这样能够避免突发流量对系统的影响,平滑处理请求,达到平均请求速率。
3.可靠性:消息队列通常具备持久化机制,可以确保消息不会丢失。
即使在生产者发送消息后,但在消费者接收消息之前,如果发生系统故障,消息也不会丢失。
什么是消息队列

什么是消息队列?消息队列是一种在应用程序之间传递消息的通信模式。
它提供了一种异步的、解耦的方式来处理消息的发送和接收。
消息队列通常被用于解决分布式系统中的通信和数据交换问题。
以下是消息队列的一些关键概念和特性:1. 生产者和消费者:消息队列中的消息生产者负责发送消息到队列,而消息消费者则负责从队列中接收和处理消息。
生产者和消费者可以是独立的应用程序,它们通过消息队列实现解耦和异步通信。
2. 消息:消息是生产者发送到消息队列的数据单元。
它可以是任意格式的数据,如文本、JSON、XML等。
消息通常包含一些元数据,如标识符、时间戳等,以帮助消费者处理和识别消息。
3. 队列:队列是消息的存储和传递机制。
它可以是内存中的数据结构或持久化存储。
消息队列通常支持先进先出(FIFO)的消息传递顺序,确保消息按照发送的顺序进行处理。
4. 可靠性:消息队列通常提供可靠性保证,确保消息的可靠传递和处理。
它可以通过持久化消息和确认机制来确保消息不会丢失或重复处理。
消息队列还可以提供消息的持久化存储,以防止系统故障导致消息丢失。
5. 异步通信:消息队列采用异步通信模式,生产者和消费者可以独立地进行操作,不需要直接的即时响应。
这种异步模式可以提高系统的可伸缩性和性能,允许生产者和消费者在不同的速率下运行。
6. 解耦和削峰:消息队列可以实现系统组件之间的解耦,使得系统更加灵活和可维护。
通过将消息发送到队列中,生产者和消费者可以独立地演化和扩展,而不会相互影响。
此外,消息队列还可以用于削峰填谷,即在高峰期缓冲请求,以平稳处理流量。
7. 多模式通信:消息队列通常支持多种通信模式,如点对点(Point-to-Point)和发布/订阅(Publish/Subscribe)。
点对点模式中,消息从一个生产者发送到一个特定的消费者;而发布/订阅模式中,消息被广播到多个订阅者。
消息队列在许多应用场景中得到广泛应用,特别是在分布式系统和微服务架构中。
消息队列的原理

消息队列的原理
消息队列是一种在应用程序之间实现异步通信的机制。
它是基于生产者-消费者模式的,即一个或多个生产者将消息放入队
列中,一个或多个消费者从队列中获取消息进行处理。
消息队列的原理如下:
1. 生产者发送消息:生产者将消息发送到消息队列中。
消息可以是任何形式的数据,如文本、图像、音频等。
2. 消息队列存储消息:消息队列是一个存储消息的缓冲区,它可以按照先进先出(FIFO)的顺序存储消息。
消息队列一般
基于内存或者持久化存储。
3. 消费者获取消息:消费者可以在任何时候从消息队列中获取消息。
消费者可以单个或批量获取消息,具体取决于实现方式。
4. 消费者处理消息:消费者获取到消息后,将对消息进行处理。
处理方式可以是执行特定的业务逻辑、将消息写入数据库、发送到其他系统等。
5. 消息确认和删除:消费者在处理完消息后,可以向消息队列发送确认消息,告知消息队列该消息已经成功处理。
消息队列接收到确认消息后,将删除该消息。
6. 处理失败的消息:如果消费者在处理消息时发生错误,可以进行相应的错误处理,例如记录日志、重试处理、发送到死信队列等。
消息队列的好处包括解耦、削峰填谷、提高系统可伸缩性、提高系统可靠性等。
它常用于处理高并发、异步处理、系统解耦等场景。
消息队列面试题

消息队列面试题在这篇文章中,我将为您提供有关消息队列面试题的详细解答。
我将以清晰、简洁的语句为您讲解各个问题,并且根据需要进行适当的分节。
请您放心,我将确保整个文章的排版整洁美观,语句通顺流畅,没有任何影响阅读体验的问题。
1. 什么是消息队列?消息队列是一种用于应用程序之间进行异步通信的技术。
它的主要作用是提供一种可靠的方式,以便发送、接收和处理消息,实现不同模块之间的解耦和高效通信。
消息队列通常采用生产者-消费者模型,其中生产者是消息的发送者,消费者是消息的接收者。
2. 消息队列的优点和适用场景是什么?消息队列有以下几个主要优点:- 异步通信:发送方无需等待接收方的处理结果,可以继续执行其他任务,提高系统的并发性和响应能力。
- 解耦性:消息队列将发送方和接收方解耦,使得系统的各个模块之间的依赖关系降低,提高了系统的可扩展性和灵活性。
- 削峰填谷:消息队列可以平衡系统的负载,当接收方处理能力不足以应对发送方的请求时,消息队列可以起到缓冲的作用,避免系统崩溃。
- 可靠性:消息队列可以提供持久化存储,确保消息在传递过程中不会丢失。
适用场景包括但不限于:- 异步任务处理:当某个任务需要较长时间来完成时,可以将任务放入消息队列中,由后台的异步工作线程来处理,提高系统的响应速度。
- 流量削平:对于突发的高流量请求,消息队列可以起到一个缓冲作用,避免系统过载。
- 系统解耦:将模块之间的通信通过消息队列来完成,降低模块之间的耦合,提高系统的可维护性。
3. 什么是消息的可靠性传输?如何实现?消息的可靠性传输是指消息在发送和接收过程中不会丢失和重复。
为了实现可靠性传输,消息队列通常采用以下几种机制或策略:- 持久化存储:将消息存储在可靠的存储介质中,如磁盘,以防止在传输过程中丢失消息。
- 确认机制:发送方在发送消息后,等待接收方的确认响应。
如果一定时间内未收到确认响应,发送方将重新发送消息。
- 重试机制:如果消息传输失败或者未收到确认响应,发送方将进行重试,直到消息被成功传输。
mq读取消息的先后机制

mq读取消息的先后机制(原创实用版)目录1.MQ 消息队列简介2.MQ 消息读取的两种机制3.消息读取的先后顺序4.结论正文1.MQ 消息队列简介消息队列(Message Queue,简称 MQ)是一种常见的消息传输模式。
在消息队列中,发送者和接收者之间通过消息进行通信,发送者将消息发送到队列中,接收者从队列中读取消息。
消息队列可以有效地解耦生产者和消费者,提高系统的可靠性和扩展性。
2.MQ 消息读取的两种机制在消息队列中,接收者读取消息主要有两种机制:先进先出(First In First Out,简称 FIFO)和优先级队列。
(1)先进先出(FIFO)先进先出机制是指消息按照发送的顺序在队列中排列,接收者按照消息到达的顺序读取消息。
这种机制下,接收者读取消息的先后顺序与消息发送的顺序一致。
(2)优先级队列优先级队列是一种按照消息优先级进行处理的机制。
优先级高的消息先被接收者读取,优先级相同的消息按照先进先出的顺序读取。
这种机制下,接收者读取消息的先后顺序可能与消息发送的顺序不一致。
3.消息读取的先后顺序根据上述两种机制,消息读取的先后顺序取决于接收者设置的策略。
在使用先进先出机制时,接收者按照消息到达的顺序读取消息;而在使用优先级队列时,接收者按照消息的优先级顺序读取消息。
4.结论MQ 消息队列提供了两种消息读取机制,即先进先出和优先级队列。
接收者可以根据实际需求选择合适的策略进行消息读取。
在需要保证消息处理顺序的场景中,可以采用先进先出机制;而在需要根据消息优先级处理时,可以采用优先级队列。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主流消息队列-RocketMQ
• RocketMQ架构图
主流消息队列-RabbitMQ
• RabbitMQ架构图
主流消息队列对比
特性
kafka
rabbitmq
rocketmq
activemq
zeromq
开发语言
scala
erlang
java
java
c
支持协议 消息存储 单机吞吐量
自行设计的基于 TCP层的协议
消息队列应用场景
• 在实际应用中常用的使用场景如下: a) 异步处理 b) 应用解耦 c) 流量削锋 d) 日志处理 e) 分布式柔性事务控制
消息队列应用场景-异步处理
• 场景说明:比如用户注册后,需要发注册邮件和注册短信。传统 的做法有两种 1.串行的方式;2.并行方式。
消息队列应用场景-异步处理
• 引入消息队列,将不是必须的业务逻辑,异步处理。改造后的设 计如下:
消息队列应用场景-应用解耦
• 场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是, 订单系统调用库存系统的接口。如下图:
• 传统模式的缺点: a) 订单系统与库存系统耦合; b) 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败
消息队列应用场景-应用解耦
• 引入消息队列,讲订单系统与库存系统解耦,如下图
• 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息 队列,返回用户订单下单成功。
• 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存 系统根据下单信息,进行库存操作
消息队列应用场景-流量削峰
• 应用场景:秒杀或团抢活动,一般会因为流量过大,导致流量暴增,应用挂 掉。为解决这个问题,一般需要在应用前端加入消息队列。
支持
支持
不支持
负载均衡
支持
支持
支持
支持
不支持
管理界面
一般
好
无
一般
无
高可用性
非常高(分布式) 高(主从)
非常高(分布式) 高(主从)
高
顺序消息
支持
不支持
支持
不支持
不支持
消息确认
支持
支持
支持
支持
支持
小结
其实现在基本上MQ主要就是下面三个流派: 1.有Broker的暴力路由:Kafka 2.有Broker的复杂路由:RabbitMQ 3.无Broker的通信流派:ZeroMQ 其他很多小众的MQ一般很少有人会用。而且用MQ的场景主要就是两大类: 1.业务系统之间异步通信 2.大数据领域的实时数据计算 • 所以一般业务系统之间通信就是会采用RabbitMQ/RocketMQ,需要复杂
消息路由和强大的消息处理功能的支撑。 • 大数据的实时计算场景会采用Kafka,需要简单的消费模型,但是超高的吞
吐量。 • 至于ZeroMQ,一般来说,少数分布式系统中子系统之间的分布式通信时会
采用,作为轻量级的异步化的通信组件。
主流消息队列-Kafka分区分配策略
• 生产者消息投递的分区分配策略
默认的分区策略是: பைடு நூலகம்) 如果在发消息的时候指定了分区,则消息投递到指定的分区 b) 如果没有指定分区,但是消息的key不为空,则基于key的哈希值来选择
一个分区 c) 如果既没有指定分区,且消息的key也是空,则用轮询的方式选择一个分
主流消息队列-Kafka分区分配策略
• partitions/replicas在broker上的分区分配策略
• 副本分配算法如下: a) 将所有N Broker和待分配的i个Partition排序. b) 将第i个Partition分配到第(i mod n)个Broker上. c) 将第i个Partition的第j个副本分配到第((i + j) mod n)个Broker上.
• 消息发送一致性:是指产生消息的业务动作与消息发送的一致。 也就是说,如果业务操作成功,那么由这个业务操作所产生的消 息一定要成功投递到消息中间件中去,否则就丢弃该消息。
• 下面用伪代码进行演示消息发送和投递的不可靠性:
消息队列应用场景-可靠消息最终一致性
• 可靠消息最终一致性架构如下:
主流消息队列-Kafka
• 日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日 志传输的问题
a) 日志采集客户端,负责日志数据采集,定时写入Kafka队列; b) Kafka消息队列,负责日志数据的接收,存储和转发; c) 日志处理应用:订阅并消费kafka队列中的日志数据;
消息队列应用场景-可靠消息最终一致性
• Kafka简介
Kafka是一种分布式的,基于发布/订阅的消息系统。主要特性如下: a) 高吞吐量、低延时:每秒可以处理几十万条消息,消息延时控制在毫秒内 b) 可扩展性:kafka集群支持热扩展 c) 持久性、可靠性:消息可持久化到本地磁盘,并支持数据备份防止数据丢
失 d) 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点宕机) e) 高并发:支持数千个客户端同时读写
区
主流消息队列-Kafka分区分配策略
• 消费者消息消费的分区分配策略 a) range策略 b) roundrobin(轮询)
range分配策略针对的是主题 1、首先,将分区按数字顺序排行序,消费者按消费者名称的字典序排好序 2、然后,用分区总数除以消费者总数。如果能够除尽,则皆大欢喜,平均分配;若除不尽, 则位于排序前面的消费者将多负责一个分区
主流消息队列-Kafka
• Kafka架构图
主流消息队列-Kafka
• topic与partition
a) topic: 在 kafka 中,topic 是一个存储消息的逻辑概念,可以认为是一个 消息集合。每条消息发送到 kafka 集群的消息都有一个类别。
b) partition:每个 topic 可以划分多个分区(每个 topic 至少有一个分区), 同一 topic 下的不同分区包含的消息是不同的。每个消息在被添加到分区 时,都会被分配一个 offset(称之为偏移量),它是消息在此分区中的唯 一编号,kafka 通过 offset保证消息在分区内的顺序,offset 的顺序不跨 分区,即 kafka只保证在同一个分区内的消息是有序的
消息队列介绍
消息队列概述
• 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, 异步消息,流量削锋,日志处理,分布式事务等问题。实现高性 能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可 缺少的中间件。
• 目前在生产环境,使用较多的消息队列有ActiveMQ, RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。
• 举个栗子,秒杀业务:上游发起下单操作;下游完成秒杀业务逻辑(库存检 查,库存冻结,余额检查,余额冻结,订单生成,余额扣减,库存扣减,生 成流水,余额解冻,库存解冻)
• 为了避免雪崩,常见的优化方案有两种: 1)业务上游队列缓冲,限速发送 2)业务下游队列缓冲,限速执行
消息队列应用场景-日志处理
内存、磁盘、数据 库。支持大量堆积
十万级
AMQP
内存、磁盘。支 持少量堆积 万级
自己定义的一套
磁盘。支持大量 堆积 万级
OpenWire、 TCP、UDP STOMP、REST、 XMPP、AMQP
内存、磁盘、数 消息发送端的内
据库。支持少量 存或者磁盘中。
堆积
不支持持久化。
万级
万级
消息事务
支持
支持