1. rabbitmq是实现了高级消息队列amqp的消息中间件,他就相当于中介一样,用来存储生产者发送的消息,并将这些消息转发给合适的消费者
2. rabbitmq的作用
1、实现业务的异步处理:将不需要同步处理,业务处理等待时间较长的业务交由rabbitmq管理,提高程序的响应速度
2、实现程序解耦合:生产者通过mq和消费者交互,实现程序解耦
**3. rabbitmq的架构:**由生产者生产消息,发送给交换机,交换机将消息路由给合适的队列,然后队列将消息转发给监听了该队列的消费者,完成消息的传输
4. 三种交换机:direct路由 fanout发布订阅 topic通配符
**5. 五种工作模式:**简单工作模式、工作队列模式、发布订阅模式、路由模式、通配符模式
6. rabbitmq如何确保消息的发送、消息的接收?
- 1、生产者发送消息:有三种情况可能会造成消息的丢失:生产者到交换机、交换机到队列、mq的宕机
- 生产者到交换机:可以在配置文件中开启publisher-confim-type为correlated,表示接收mq返回消息发送结果的类型为异步回调,当生产者发送消息到交换机,如果返回的回执是ack,则表示消息发送成功,如果返回的回执是nack,则表示消息没有发送成功,此时需要我们写代码,使生产者重新发送消息。代码可以调用RabbitTemplate的setConfimCallback方法,构建ConfirmCallback匿名对象,实现confirm方法,在该方法中重新发送消息,框架的底层会在消息未发送到交换机时自动调用该方法,直到消息发送到交换机
- 交换机到队列:可以在配置文件中开启publisher-return为true,表示接收交换机路由信息到队列的回执信息,当交换机未成功路由信息到队列,就会返回nack的回执信息,此时就需要我们写代码,使生产者重新发送信息。代码可以调用RabbitTemplate的setReturnCallback方法,构建ReturnCallBack匿名对象,重写retuenedMessage方法,在方法中重新发送消息,该方法也是在消息未成功路由到队列时由框架自动调用,直到消息路由到队列
- mq宕机:为了防止mq宕机造成消息的丢失,就要设置mq的持久化机制。交换机的持久化、队列的持久化、消息的持久化。交换机的持久化和队列的持久化需要我们在创建他们的时候设置对应的durable属性为true;消息的持久化一般我们不需用设置,因为框架的底层会将发送的信息自动封装成Message对象,且框架已对该对象进行了消息的持久化。消息的持久化就是将消息存到磁盘中。这样,即使mq宕机,也不会造成消息的丢失。
- 2、消费者消费消息:有两种情况可能会造成消息的丢失:消费者处理消息时抛出一样、消费者拿到消息还未处理,出现宕机。
- 为了解决这一问题,可以在消费者的配置信息中开启消费者信息确认机制,配置spring-rabbitmq-listener-simple-acknowledge,该配置共有三个属性,nono、auto、manual。
- nono是队列将信息推送给消费者后,直接丢弃信息;
- auto是队列将信息推送给消费者后,不会直接丢弃信息,而是等消费者给mq发送一个消息处理结束的回执,如果成功处理,队列就会删除该信息;如果未处理成功,mq收到失败回执会重新发送信息,直到消费者处理成功为止
- manual是在消费者处理消息发生异常时,需要我们编写对应的代码来处理逻辑,而不是由框架自动处理。
一般情况下,推荐将该配置的属性设置为auto,由框架底层自动取检测并处理。
7. 消失失败的重试机制:
. 本地重试:利用spring的retry机制,当消费者出现异常时,不会将消息返回给队列,而是在本地重试。在配置信息中配置spring-rabbitmq-listener-simple-retry的enable属性为true,还可以配置一些其他属性如:重试的次数和重试的间隔时间
. 失败策略:失败策略有三种:RejectAndDontRequeueRecoverer,重试失败后,直接丢弃;
ImmediateRequeueMessageRecoverer,重试失败后,返回到队列中;
RepublishMessageRecoverer,将消息投递给指定的交换机。
推荐使用第三种,定义MessageRecoverer的bean对象为RepublishMessageRecoverer,可以将所有出现异常的消息投递
给指定的交换机,然后交换机路由到指定的队列中,这样既保存了该消息,也方便我们后续人工处理
8. 死信交换机
出现的情况:消息被拒绝,消息过期,队列超载
解决:可以定义一个死信交换机,并绑定死信队列,在发消息的队列中定义 exchangekey(死信交换机的路由key),这样当发送消息的队列出现上述情况,就可以将消息投递给死信交换机,路由到死信队列,实现消息的存储
**9. 延迟队列:**可以在发送消息的队列中定义消息过期时间 TTL、exchange(死信交换机)、exchangekey(死信交换机的路由key),这样就可以将发送的消息在规定的时间内投递到死信交换机,路由到死信队列,这样消费者只需要监听死信队列,就可以实现在规定的时间内接收到指定的信息,实现一些定时的功能
**10. 惰性队列:**惰性队列就是将消息存到磁盘中。当消费者消费消息的速度低于生产者生产消息的速度,就会造成消息的堆积,之后发送的消息进不去队列,可能会成为死信,为了解决这一问题,通常有两种方式:第一种是增加消费者,提高该队列消息的消费速度;第二种就是惰性队列,我们可以在定义队列的时候,将该队列定义为惰性队列,直接将消息存到磁盘中,而非内存。 代码中,可以在创建该队列的时候定义lazy()属性,创建惰性队列。
**11. mq如何确保消息的执行顺序:**发送到同一个队列;同步消息,消息发送成功才会发送下一个消息。
12. 避免消息的重复消费:
发送消息:发送的消息设置唯一的标识
消费消息:通过分布式锁setnx锁解决,键是唯一标识,锁创建成功才会处理消息,锁创建失败就证明该消息已经处理过了
.
绝对详细的RabbitMQ实践操作手册,看完本系列就够了。一、什么是MQ?1、MQ的概念2、理解消息队列二、MQ的优势和劣势1、优势和作用2、劣势三、MQ的应用场景四、AMQP五、工作原理一、什么是MQ?1、MQ的概念MQ全称MessageQueue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。下面用图来理解异步通信,并阐明与同步通信的区别。同步通信:甲乙两人面对面交流,你一句我一句必须同步进行,两人除此之外不做任何事情异步通信:异步通信相当于通过第三方转述对话,可能有消息的延迟,但不需要二人时刻保持联系,消息传给第三方后,两人可以做其他自己想做的事情,当需要获取
RabbitMQ+WebStomp很棒。但是,我有一些主题我希望安全为只读或只写。似乎保护这些的唯一机制是使用rabbitmqctl。我可以创建一个虚拟主机,一个用户,然后应用一些权限。然而,这就是Stomp和Rabbit实现开始崩溃的地方。主题采用以下形式:stomp中的/topic/blah,它使用路由键“blah”路由到Rabbit中的“amq.topic”。似乎没有办法为路由key设置权限。似乎:rabbitmqctlset_permissions-pvhostuser".*"".*""^amq\.topic"是我能做的最好的,这仍然是“所有”主题。我也研究过交换,但没有办法在
1.延迟队列延迟队列,即消息进入队列后不会立即被消费,只有到达指定时间后,才会被消费。很可惜,在RabbitMQ中并未提供延迟队列功能,但是我们有其他的方式可以实现延迟队列,方法就是TTL+死信队列,组合实现延迟队列的效果。2.什么是TTLTTL,全称TimeToLive,消息过期时间设置。消息的TTL就是消息的存活时间。RabbitMQ可以对队列和消息分别设置TTL。对队列设置就是队列没有消费者连着的保留时间,也可以对每一个单独的消息做单独的设置。超过了这个时间,我们认为这个消息就死了,称之为死信。队列过期后,会将队列所有消息全部移除。一个队列中某一个消息过期后,只有消息在队列顶端,才会判断
我正在使用Titaniumappcelerator实现移动应用程序。在此应用中,我需要使用RabbitMQ实现聊天。我看到了很多关于如何使用节点js连接到RabbitMQ服务器的示例,但在我的例子中它不适用,我找不到任何JavaScript独立客户端。我想知道是否有一种方法可以在没有客户端的情况下连接到RabbitMQ,或者是否有任何JavaScript独立客户端? 最佳答案 是RabbitMQWebSTOMP吗?你在找什么?使用SockJS,即使在旧浏览器中也能正常工作,不需要Node.js或您编写的任何网络服务器端代码。
一、先检查一下Eralng是否安装好并配置好环境 新建系统变量名为:ERLANG_HOME变量值为erlang安装地址 双击系统变量path,点击“新建”,将%ERLANG_HOME%\bin加入到path中。检查是否安装好:二、1、管理员运行cmd然后打开RabbitMQ安装目录\sbin2、rabbitmq-service.batremove3、setRABBITMQ_BASE=D:\rabbitmq_server\data(D:\rabbitmq_server\data是我自己自定义的目录,这样就绕过c\user\用中文用户名…这个文件夹,这样就不会有中文路径的问题了)4、rabbitm
RabbitMQ在wifi网络中运行良好,我在运行ArchLinux的笔记本电脑中设置了RabbitMQ。但是,当我在不同的wifi网络中使用同一台笔记本电脑时,出现以下错误:machinery:worker.go:42:Goingtoretrylaunchingtheworker.Error:Dial:dialtcp0.0.0.0:5672:getsockopt:connectionrefusedmachinery:retry.go:20:Retryinginxseconds我不知道为什么RabbitMQ在一个网络中工作而不在另一个网络中工作。我尝试更改/etc/rabbitmq/r
这个问题在这里已经有了答案:HowtodetectdeadRabbitMQconnection?(4个答案)关闭9个月前。我正在使用github.com/streadway/amqp对于我的程序。在重新初始化之前,我应该如何确保用于消费和/或生产的channel仍在工作?例如,在ruby中,我可以简单地做:bunny_client=Bunny.new({....})bunny_client.start启动客户端,ifnotbunny_clientorbunny_client.status!=:connected#re-initializetheclient如何使用streadway
我正在使用rabbitmq和golang,我在comsumer端创建了一个等待消息的线程,例如rabbitmq示例。我想主线程将等待kill信号并将信号发送到rabbitmq线程,但如果消息未推送到队列中,rabbitmq线程将永远等待,因此它不会处理kill信号消息。我发现rabbitmq在comsumer中有超时,但我刚刚在java中找到了代码,而不是golang。你能帮助我吗?谢谢。 最佳答案 如果我对您的问题的理解正确,您希望能够退出例行处理队列?超时设置在这里不起作用。这是针对服务器/客户端心跳的,只有在任何时候都没有收到
我的项目采用在GoogleCloud中运行的微服务器架构。我正在考虑从使用RabbitMQ的容器迁移到PubSub引擎。问题是:是否可以一条一条的接收消息?我的代码是用Go和docs编写的说Thecallbackisinvokedconcurrentlybymultiplegoroutines,maximizingthroughput.但是可以调用多少个goroutines呢?如何设置允许的最大值?例如。我的一名工作人员使用第三方API,每个IP仅允许一个连接,因此我只能及时为该工作人员执行一项任务。 最佳答案 正确的解决方案是Ap
我正在尝试使用Go建立一个简单的TLS连接,RabbitMQ在尝试创建启用了TLS的连接(Go客户端)时报告了这个问题:rabbitmq_1|2018-04-1613:37:54.146[error]**Statemachineterminatingrabbitmq_1|**Lastevent={{call,{,#Ref}},{new_user,}}rabbitmq_1|**Whenserverstate={error,"tls_connection:format_status/2crashed"}rabbitmq_1|**Reasonfortermination=error:func