分享一个c写的开源分布式消息队列equeue.docVIP

分享一个c写的开源分布式消息队列equeue.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
分享一个c写的开源分布式消息队列equeue

前言 本文想介绍一下前段时间在写enode时,顺便实现的一个分布式消息队列equeue。这个消息队列的思想不是我想出来的,而是通过学习阿里的rocketmq后,自己用c#实现了一个轻量级的简单版本。一方面可以通过写这个队列让自己更深入的掌握消息队列的一些常见问题;另一方面也可以用来和enode集成,为enode中的command和domain event的消息传递提供支持。目前在.net平台,比较好用的消息队列,最常见的是微软的MSMQ了吧,还有像rabbitmq也有.net的client端。这些消息队列都很强大和成熟。但当我学习了kafka以及阿里的rocketmq(早期版本叫metaq,自metaq 3.0后改名为rocketmq)后,觉得rocketmq的设计思想深深吸引了我,因为我不仅能理解其思想,还有其完整的源代码可以学习。但是rocketmq是java写的,且目前还没有.net的client端,所以不能直接使用(有兴趣的朋友可以为其写一个.net的client端),所以在学习了rocketmq的设计文档以及大部分代码后,决定自己用c#写一个出来。 项目中包含了队列的全部源代码以及如何使用的示例。也可以在enode项目中看到如何使用。 equeue消息队列中的专业术语 Topic 一个topic就是一个主题。一个系统中,我们可以对消息划分为一些topic,这样我们就能通过topic,将消息发送到不同的queue。 Queue 一个topic下,我们可以设置多个queue,每个queue就是我们平时所说的消息队列;因为queue是完全从属于某个特定的topic的,所以当我们要发送消息时,总是要指定该消息所属的topic是什么。然后equeue就能知道该topic下有几个queue了。但是到底发送到哪个queue呢?比如一个topic下有4个queue,那对于这个topic下的消息,发送时,到底该发送到哪个queue呢?那必定有个消息被路由的过程。目前equeue的做法是在发送一个消息时,需要用户指定这个消息对应的topic以及一个用来路由的一个object类型的参数。equeue会根据topic得到所有的queue,然后根据该object参数通过hash code然后取模queue的个数最后得到要发送的queue的编号,从而知道该发送到哪个queue。这个路由消息的过程是在发送消息的这一方做的,也就是下面要说的producer。之所以不在消息服务器上做是因为这样可以让用户自己决定该如何路由消息,具有更大的灵活性。 Producer 就是消息队列的生产者。我们知道,消息队列的本质就是实现了publish-subscribe的模式,即生产者-消费者模式。生产者生产消息,消费者消费消息。所以这里的Producer就是用来生产和发送消息的。 Consumer 就是消息队列的消费者,一个消息可以有多个消费者。 Consumer Group 消费者分组,这可能对大家来说是一个新概念。之所以要搞出一个消费者分组,是为了实现下面要说的集群消费。一个消费者分组中包含了一些消费者,如果这些消费者是要集群消费,那这些消费者会平均消费该分组中的消息。 Broker equeue中的broker负责消息的中转,即接收producer发送过来的消息,然后持久化消息到磁盘,然后接收consumer发送过来的拉取消息的请求,然后根据请求拉取相应的消息给consumer。所以,broker可以理解为消息队列服务器,www.ipb.cc 提供消息的接收、存储、拉取服务。可见,broker对于equeue来说是核心,它绝对不能挂,一旦挂了,那producer,consumer就无法实现publish-subscribe了。 集群消费 集群消费是指,一个consumer group下的consumer,平均消费topic下的queue。具体如何平均可以看一下下面的架构图,这里先用文字简单描述一下。假如一个topic下有4个queue,然后当前有一个consumer group,该分组下有4个consumer,那每个consumer就被分配到该topic下的一个queue,这样就达到了平均消费topic下的queue的目的。如果consumer group下只有两个consumer,那每个consumer就消费2个queue。如果有3个consumer,则第一个消费2个queue,后面两个每个消费一个queue,从而达到尽量平均消费。所以,可以看出,我们应该尽量让consumer group下的consumer的数目和topic的queue的数目一致或成倍数关系。这样每个consumer消费的queue的数量总是一样的,这样每个consumer服务器的压力才会

文档评论(0)

dlive45 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档