RabbitMq 相关概念理解

RabbitMq 相关概念理解,第1张

RabbitMq 相关概念理解 一、mq的优劣:

优点:

异步、解耦、削峰

缺点:

系统可用性降低、系统复杂度提高、一致性问题

降低系统可用性:a系统访问b系统,现在多了一个需要关心的mq系统。 系统引入的外部系统越多,可用性越差。

复杂度提高:a系统发给了mq,mq发给b系统,需要保证消息的没有重复消费,消息丢失。

消息一致性问题:

二、rabbitmq基本概念 1.1 rabbitmq简介

AMQP,即Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准。

指的就是rabbitmq的消费规则。 生产者-》交换器-》队列-》消费者

broker:服务端(rabbitmq server)

包含了虚拟机(vhost)、vhost中有交换机、队列,交换机可以绑定不同的队列。

虚拟机:(vhost)

方便不通的用户使用。我们公司按系统划分。

connection:

发布者/消费者和broker之间的TCP连接

channel:

信道是在connection内部简建立的逻辑连接。减少tcp连接的开销

exchange:

消息到达broker的第一站,会根据routing key,分发消息到queue中。

queue:

在队列中等待消费者取走

binding:

exchange和队列之间的虚拟连接。

1.2 rabbitmq工作模式。

1.2.1简单模式

生产这发送消息给mq服务,然后消费者来消费。

1.2.2 work工作模式

多个消费者监听同一个队列,争抢当前队列的消息,谁先拿到谁消费。

1.2.3发布订阅模式

每个消费者监听自己的队列

生产者将消息发送给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息。

交换机类型:

fanout:广播,将消息交给所有绑定交换机的队列

direct:定向,把消息交给符合执行routingkey的队列。

topic:通配符,把消息交给符合routing pattern的队列

1.2.4 路由模式

交换机收到消息,根据routingkey,路由到不通的队列。绑定队列和交换机的代码中需要传routingkey,采用的是direct模式。

1.2.5 topic模式

绑定交换机和队列采用topic模式。

三、rabbitmq高级特性 3.1消息的可靠性投递

作为消息发送发希望杜绝任何消息丢失或者投递失败场景。

3.1.1 /confirm/i确认模式

1.需要开启

2.消息从producer到exchange会返回一个/confirm/iCallback回调函数。里面有boolean类型的ack字段,成功true,失败false。

3.1.2 return 退回模式

1.需要开启

消息从exchange到queue投递失败则会返回一个returnCallBack回调函数。有两种模式,丢弃,或者交给回调函数处理。

3.1.3 事务模式

性能差,没有用

3.1.4 Consumer ACK投递

ack指Acknowledge,确认。表示消费单收到消息后的确认方式。

自动确认

acknowledge=’none‘

消费者收到消息就就回复确认。

手动确认

acknowledge='manual'

收到消息手动调用代码确认。 如果消费端没有出现异常,调用channel.basicAck()方法确认签收消息。如果出现异常,在catch中调用basicNack或者basicReject,拒绝消息,通过参数设置,mq会重新发送。

根据异常情况确认

acknowledge=’auto‘

根据抛出异常的不通,做不通的处理

3.1.5 持久化

exchange、queue、message需要持久化

3.1.6 broker高可用

3.2 消费端限流

mq投递消息过快,导致消费者承载不了。所以mq消费需要限流。

需要设置为手动确认manual,然后设置每次消费几条消息,只有签收后,才会继续投递。

3.3TTL

全称:Time to Live(存活时间/过期时间)

当消息到达存活时间后,如果还没有被消费,就会被自动清除。

rabbitmq可以对消息设置过期时间,也可以对整个队列设置过期时间。(2个都设置,时间短的为准)

注意:队列设置,所有消息清除,消息设置:消息过期后,只有消息在队列顶端,才会被清除。

3.4 死信队列

DLX,Dead Letter Exchange 死性交换机。当消息成为Dead message后,可以被重新发送到另一个交换机,这个交换机就是DLX。

3.4.1消息成为死性:

1.队列消息长度达到限制(队列可以设置存储几条消息)

2.消费者拒绝接收消费消息,basicNack、basicReject,并且不把消息重新放入原目标队列,requeue=false

3.原队列存在消息过期时间,消息到达过期时间后没有被消费。(设置队列和消息都可以)

3.4.2 绑定死性交换机

3.5 延时队列

ttl+死性队列。原队列设置过期时间,没有消费者,然后死性队列启动消费者,消费。

3.6 日志与监控

日志存储路径:/var/log/rabbitmq/

3.6.1 rabbitmqctl管理和监控

查看队列:rabbitmqctl list_queues

查看vhost: rabbitmqctl list_vhosts

3.7 消息可靠性分析与追踪

需要一个较好的机制跟踪记录消息的投递过程,以此协助开发和运维人员进行定位问题。

rabbitmq可以使用Firehose和rabbit_traceing插件功能来实现消息追踪。

3.7.1 Firehose

使用一个内部交换机,所有的消息都会发送到这个交换机。这个交换机会加一些配置信息再给你发一条。

3.7.2 rabbitmq-tracing

四、RabbitMq应用问题 4.1消息可靠性保障

需要:100%发送成功

4.1.2 消息补偿

 

生产者发送消息后,还会延时发送一个消息到q3,消费这确认收到成功后,会发消息到q2,存储到mdb中。q3比对mdb,然后确定是否让生产者再次发送。

4.2消息幂等性处理

一次或者多次请求一个资源,对资源本身有相同的结果。

图同上

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4827393.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-10
下一篇 2022-11-10

发表评论

登录后才能评论

评论列表(0条)

保存