MQ消息中间件

*MQ(Message Queue)消息队列

概念:

**
一种先进先出的数据结构,一般用来解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。

分类:

ActiveMQ

优点:单机吞吐量万级,时效性ms级,可用性高,基于主从架构实现高可用性,消息可靠性,较低的概率发生数据丢失
缺点:缺少维护,不适用于高吞吐量的场景

Kafka

优点:单机吞吐量在百万级,时效性ms级,可用性非常高。kafka是分布式的,一个数据多个副本,不会出现数据丢失,在日志管理领域十分成熟。
缺点:Kafka 单机超过 64 个队列/分区,Load 会发生明显的飙高现象,队列越多,load 越高,发送消息响应时间变长,使用短轮询方式,实时性取决于轮询间隔时间,消费失败不支持重试;支持消息顺序,但是一台代理宕机后,就会产生消息乱序,社区更新较慢;

RocketMQ

优点:单机吞吐量十万级,可用性高,采用分布式架构,不会出现数据丢失,扩展性好
缺点:支持的客户端语言不多

RabbitMQ

优点:单机吞吐量万级,由于erlang语言的高并发特性,性能较好,MQ功能比较完备,支持多种语言,支持AJAX文档齐全,开源的管理界面成熟,更新频率高
缺点:不适用于大型项目

springboot整合RabbitMQ消费端手动ACK确认机制

ack——在RabbitMQ中指的是消费者收到信息后确认的一种行为,关注点在于消费者是否实际接收到MQ发送的信息。
三种确认方式:
1.自动确认(acknowledge=“none”):默认情况下springboot-data-AMQP是自动ACK机制,就意味着MQ会在消息发送完毕后,自动帮我们去ACK,然后删除消息。但是如果消费者处理消息需要较长时间,最好的办法就是消费端处理之后手动确认。
2.手动确认(acknowledge=“manual”):当消费者收到消息后,不会立即告诉RabbitMQ已经收到消息了,而是等待业务处理成功后,通过调用代码的方式手动向MQ确认消息已经收到。当业务出现错误或者异常的时候,可以进行一些重试或者让MQ重新向消费者发送信息。
3.根据异常情况确认(acknowlege=“auto”):通过抛出异常的类型,来做响应处理。

消费端手动ACK确认

https://blog.csdn.net/m0_67392931/article/details/124338948

Spring AMQP

https://blog.csdn.net/qq_45797116/article/details/126446636

SpringAMQP提供了三个功能:
1.自动声明队列、交换机及其绑定关系
2.基于注解的监听器模式,异步接收消息
3.封装了RabbitTemplate工具,用于发送消息

1.Basic Queue简单队列模型

2.WorkQueue任务模型

多个消费者绑定到一个队列,共同消费队列的消息,适用与生产消息的速度远远大于消息的消费速度,避免消息堆积而无法及时处理。
MQ消息中间件_第1张图片
不同的消费者的处理能力不一样,如果把消息平均分配给每个消费者,会降低处理效率。我们一般会采用能者多劳的方式,每次只获取一条消息,处理完成后才能获取下一个消息,处理能力高的消费者处理更多的消息。
方法:修改consumer服务的application.yml文件,添加配置:
spring:
rabbitmq:
listener:
simple:
prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息

发布订阅模式

MQ消息中间件_第2张图片
Exchange(交换机):只负责转发消息,不会存储消息,如果没有任何队列和交换机绑定,或者没有符合路由规则的队列,那么消息就会丢失

在发布订阅模式中,多了一个交换机,消息不在是直接发送到队列中,而是先发送到交换机,交换机一方面接收生产者发送的消息,另一方面知道如何处理消息,比如递交到一个特定的消息队列,或者所有队列,或者一类队列,或者将消息丢弃。

Exchange的三种类型:

1.Fanout广播

交换机把消息发送给绑定过的所有队列,订阅队列的消费者都可以拿到消息。
流程:创建一个交换机itcast.fanout,类型是Fanout
创建两个队列fanout.queue1和fanout.queue2,绑定到交换机itcast.fanout

MQ消息中间件_第3张图片

2.Direct定向

队列与交换机的绑定需要指定一个路由key(RoutingKey),生产者在发送消息时,也需要指定消息的RoutingKey,队列只会接收到与他自己的路由Key一样的消息。

MQ消息中间件_第4张图片

3.Topic通配符

Topic类型的交换机与Direct相比,都是根据RoutingKey将消息路由到不同的队列。但是Topic类型的交换机可以在队列绑定的时候使用通配符。
RoutingKey一般都是由一个或者多个单词组成,单词之间用“.”分割

通配符规则:
** “#”:匹配一个或者多个词
”:只匹配一个词***

MQ消息中间件_第5张图片

消息转换器

Spring会把发送的消息序列转化为字节发送给MQ,接收消息的时候,在把字节反序列化为Java对象。默认情况下,Spring采用的序列化方式是JDK序列化,而JDK序列化存在数据体积过大、存在安全漏洞、可读性差等问题。所以,我们一般会采用JSON方式来做序列化和反序列化。

1.在生产者和消费者中都导入依赖:

com.fasterxml.jackson.dataformat
jackson-dataformat-xml
2.9.10

2.配置消息转换器,在启动类中添加一个Bean
/**
* 修改默认的jdk序列化为json序列化
* @return
*/
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}

你可能感兴趣的:(java-rabbitmq,rabbitmq,kafka)