Rabbitmq-C的简单使用(三) -- 任务队列模式的简介

对以前文章的总结

通过上两篇文章,基本可以使用rabbitmq-c函数来写一个简单的demo来发送消息到队列,以及从队列中读取消息。

起码说,不会对头文件中的函数有陌生的感觉的了,只有在顺利的使用中才会有想更进一步研究的欲望。

按照我的学习进度和习惯,我现在准备来了解一下rabbitmq的工作模式,在知道了工作模式之后,才能够更准确的调用和理解函数 。

 

学习资料

我学习借鉴的资料主要是靠B站的视频,推荐两个

https://www.bilibili.com/video/BV1dE411K7MG?from=search&seid=8614304784326402102    

https://www.bilibili.com/video/BV14A411q7pF?from=search&seid=8614304784326402102

这个写应该没有什么侵权的吧 -.-

当然也会粗略的看一下官方网站对工作模式的介绍。

 

文章水平

以我目前的能力,只是将上面资料中所述的知识点提炼总结一下而已,而且未必能做的很好,希望高手能谅解。

其实工作模式应该是和编程语言没有很大的关系了,毕竟什么语言都是这几个模式,但是作为学习rabbitmq的一部分,我还是要自己来写,否则理解不深刻。

如果您觉得有更好的讲解这部分的博客文章,也希望可以在下面评论中推送给我,谢谢。

 

开始

        工作模式主要是描述消费者和生产者如何使用队列进行消息的交互。

        https://www.rabbitmq.com/getstarted.html      官网工作模式介绍没有C接口的 :-)

 

任务队列模式

         目前我们使用的模式是下面这样。

        当消息处理比较耗时,消息的生产速度会远远大于消息的消费速度。这样队列中消息会堆积的越来越多。

        此时可以使用任务队列,多个消费监听同一个消息队列,队列中的消息只能被消费一次(消费完就会消失,这样不会被重复执行)。在每个消费者消费能力相同的情况下,rabbitmq将顺序的把消息发送到每个消费者,平均每个消费者都会收到相同数量的消息。这是一种轮询的发放消息。(注意两张图数字的不同)

        如果消息过多,当前的消费者处理不过来那么可以扩展消费者。

         

         然而上面这样的情况也是很少的,每个消费者的能力一般不会相同,那么队列继续以轮询方式的发送数据就不合适了,在官网中提到了一个公平派遣的例子,如下图所示,以轮询方式发送数据,结果就是一个消费者累死一个消费者闲死,虽然都是一个消费者处理一条消息,但是这公平吗,不公平。

        This happens because RabbitMQ just dispatches a message when the message enters the queue. It doesn't look at the number of unacknowledged messages for a consumer. It just blindly dispatches every n-th message to the n-th consumer.

        发生这种情况是因为RabbitMQ在消息进入队列时才调度消息。它不会查看消费者的未确认消息数。它只是盲目地将每第n条消息发送给第n个使用者。(侧边翻译)

        上面这个产生结果的原因是消息确认机制导致的,消费在接受到队列发送的消息后会自动向队列发送确认,这样队列可以很快的把消息都发送完。

        这样说有点难懂,就举一个工作上的例子,员工A向老板索要任务,员工A收到任务后就说“OK,再来一个”,于是老板又给一个,就这样,一个小时内员工A从老板那里获取了20个任务,但是他得一个一个完成呀,按他的能力算,一天完成一个吧,那他需要20天才能完成。公司里还有一个员工B,也是按照上面的方式获取了20个任务,但是人家厉害呀,一天就能完成20个任务。老板过两天一看,好家伙,A都快累死了,B天天玩游戏摸鱼不亦乐乎。这个例子中老板就是消息队列,A、B就是消费者,两个人获取了同样数量的任务相当于轮询发的任务,“OK,再来一个”就是向队列发送的自动确认。我们可以这么想,如果A每次在完成任务后再和老板要任务,那么他就不会很累,B就不会很闲了。

        关于rabbitmq的消息确认机制, 消息确认分为自动确认手动确认

        自动确认时,消费者在接收到消息后会直接向队列发送确认,这种情况下不会考虑业务是否执行完毕,队列会将消息直接删除掉。如果消费者在执行业务的过程中死掉了,这样会丢失未处理的业务数据。手动确认是在消费者出完数据后通过函数来向队列发送确认。       

        所以为了实现公平派遣任务,我们需要设置消费者手动确认,其次为了不丢失每一条数据,我们需要设置队列每次向消费者发送一条数据即可。

      

     

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值