优点:
异步、解耦、削峰
缺点:
系统可用性降低、系统复杂度提高、一致性问题
降低系统可用性: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消息幂等性处理一次或者多次请求一个资源,对资源本身有相同的结果。
图同上
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)