{"id":27044787,"url":"https://github.com/berkaroad/rabbitmqtopic","last_synced_at":"2025-06-10T17:32:42.479Z","repository":{"id":81379405,"uuid":"254414177","full_name":"berkaroad/RabbitMQTopic","owner":"berkaroad","description":"模拟RocketMQ的Topic方式的消息发送和接收。","archived":false,"fork":false,"pushed_at":"2020-07-25T02:45:33.000Z","size":333,"stargazers_count":5,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-05T08:18:12.679Z","etag":null,"topics":["mq","rabbitmq","rocketmq","topic"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/berkaroad.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-04-09T15:48:41.000Z","updated_at":"2025-02-12T06:38:53.000Z","dependencies_parsed_at":null,"dependency_job_id":"aca11a70-a6c7-4124-9209-5a95b39af4f9","html_url":"https://github.com/berkaroad/RabbitMQTopic","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/berkaroad%2FRabbitMQTopic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/berkaroad%2FRabbitMQTopic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/berkaroad%2FRabbitMQTopic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/berkaroad%2FRabbitMQTopic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/berkaroad","download_url":"https://codeload.github.com/berkaroad/RabbitMQTopic/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/berkaroad%2FRabbitMQTopic/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259117716,"owners_count":22807820,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["mq","rabbitmq","rocketmq","topic"],"created_at":"2025-04-05T05:30:07.070Z","updated_at":"2025-06-10T17:32:42.463Z","avatar_url":"https://github.com/berkaroad.png","language":"C#","readme":"# RabbitMQTopic\n\n![.NET Core](https://github.com/berkaroad/RabbitMQTopic/workflows/.NET%20Core/badge.svg)\n\n模拟RocketMQ的Topic方式的消息发送和接收。\n\n1）支持集群消费：相同消费组，不同消费者之间实现负载均衡，一个队列有且仅有一个消费者；\n\n2）支持广播消费：不同消费组，可以消费同一个消息；\n\n3）支持延迟消息，需启用插件 rabbitmq_delayed_message_exchange；\n\n4）消费模式，同时支持Push模式和Pull模式（Pull模式下，未响应数超过此设置后，将暂停1秒拉取消息），这两种模式都支持消息顺序消费。\n\n## 安装\n\n```plain\ndotnet add package RabbitMQTopic\n```\n\n## 用法\n\n消费者用法，见 [ConsumerApp](src/Samples/ConsumerApp/Program.cs)\n\n生产者用法，见 [ProducerApp](src/Samples/ProducerApp/Program.cs)\n\n## 性能测试\n\n性能测试，见 [PerformanceTests](src/Samples/PerformanceTests/Program.cs)\n\n以下数据，是在2Core Mac笔记本上进行，dotnetcore和rabbitmq都在笔记本上。\n\n```plain\ndotnet run --project src/Samples/PerformanceTests -c Release\n\nSend message completed, time spent: 58375ms, message count: 100000, throughput: 1713tps.\n\nConsume message by Push completed, time spent: 14022ms, message count: 100000, throughput: 7131tps.\n\nSend message completed, time spent: 56270ms, message count: 100000, throughput: 1777tps.\n\nConsume message by Pull completed, time spent: 22765ms, message count: 100000, throughput: 4392tps.\n```\n\n以下数据，是在8Core Mac笔记本上进行，dotnetcore和rabbitmq都在笔记本上。\n\n```plain\ndotnet run --project src/Samples/PerformanceTests -c Release\n\nSend message completed, time spent: 15220ms, message count: 100000, throughput: 6570tps.\n\nConsume message by Push completed, time spent: 8405ms, message count: 100000, throughput: 11897tps.\n\nSend message completed, time spent: 15489ms, message count: 100000, throughput: 6456tps.\n\nConsume message by Pull completed, time spent: 17743ms, message count: 100000, throughput: 5636tps.\n```\n\n## Topic 与 RabbitMQ 的映射关系\n\nConsumer 启动后，如果设置的autoConfig为true，则会自动创建Exchange、Queue和Bind；\n\nProducer 启动后，如果设置的autoConfig为true，则会自动创建Exchange和Bind。\n\n每创建一个Topic，对应在RabbitMQ下会创建如下：\n\n1）一个Topic对应一个Exchange（fanout）\n\n```csharp\nExchangeDeclare(\"\u003cTopicName\u003e\", \"fanout\", true, false);\n```\n\n2）Topic下，一个消费组对应一个Exchange（direct），默认消费组名为“default”\n\n```csharp\nExchangeDeclare(\"\u003cTopicName\u003e.G.\u003cGroupName\u003e\", \"direct\", true, false);\n```\n\n3）Topic下，一个消费组对应的Queue数为Topic的队列数，如Topic的队列数为4，则Queue如下\n\n```csharp\nQueueDeclare(\"\u003cTopicName\u003e.G.\u003cGroupName\u003e-0\", true, false, false);\nQueueDeclare(\"\u003cTopicName\u003e.G.\u003cGroupName\u003e-1\", true, false, false);\nQueueDeclare(\"\u003cTopicName\u003e.G.\u003cGroupName\u003e-2\", true, false, false);\nQueueDeclare(\"\u003cTopicName\u003e.G.\u003cGroupName\u003e-3\", true, false, false);\n```\n\n4）添加Exchange绑定\n\n```csharp\nExchangeBind(\"\u003cTopicName\u003e.G.\u003cGroupName\u003e\", \"\u003cTopicName\u003e\", \"\");\n```\n\n5）添加Queue绑定\n\n```csharp\nQueueBind(\"\u003cTopicName\u003e.G.\u003cGroupName\u003e-0\", \"\u003cTopicName\u003e.G.\u003cGroupName\u003e\", \"0\");\nQueueBind(\"\u003cTopicName\u003e.G.\u003cGroupName\u003e-1\", \"\u003cTopicName\u003e.G.\u003cGroupName\u003e\", \"1\");\nQueueBind(\"\u003cTopicName\u003e.G.\u003cGroupName\u003e-2\", \"\u003cTopicName\u003e.G.\u003cGroupName\u003e\", \"2\");\nQueueBind(\"\u003cTopicName\u003e.G.\u003cGroupName\u003e-3\", \"\u003cTopicName\u003e.G.\u003cGroupName\u003e\", \"3\");\n```\n\n6）在发送延迟消息前，会额外创建Exchange（x-delayed-message）和Bind。（RabbitMQ需启用插件 rabbitmq_delayed_message_exchange）\n\n```csharp\nExchangeDeclare(\"\u003cTopicName\u003e-delayed\", \"x-delayed-message\", true, false, new Dictionary\u003cstring, object\u003e {\n    { \"x-delayed-type\", \"fanout\" }\n});\nExchangeBind(\"\u003cTopicName\u003e\", \"\u003cTopicName\u003e-delayed\", \"\");\n```\n\n## 发布历史\n\n### 1.2.6\n\n```plain\n1）Producer增加RegisterTopic重载方法，允许指定消费组列表，并在配置autoConfig时，自动创建消费组相关的Exchange、Queue，未指定消费组列表时，消费组列表为默认消费组。\n```\n\n### 1.2.5\n\n```plain\n1）修复CRC16算法的bug，解决路由不均匀问题；\n2）Producer的Channel池增加池大小限制，默认为1000;\n3）Producer的路由算法优化，由原来的取模运算改为位运算，提高性能.\n```\n\n### 1.2.4\n\n```plain\n1）调整Consumer的GroupName的处理，默认为空字符串，但映射到Exchange、Queue时，默认用“default”来拼接；\n2）优化Producer的Channel池。\n```\n\n### 1.2.3\n\n```plain\n1）使用Channel池，提升Producer发送消息性能，会定时回收长时间不使用的channel；\n2）优化Producer、Consumer的Start和Shutdown。\n```\n\n### 1.2.2\n\n```plain\n1）IMessageTransportationContext 移除属性 DeliveryTag。\n```\n\n### 1.2.1\n\n```plain\n1）优化Pull模式，在空转情况下，平衡实时性和空转性能消耗。\n```\n\n### 1.2.0\n\n```plain\n1）TopicMessage更名为Message，取消属性QueueCount，更名DelayedMillisecond为DelayedMilliseconds；\n2）Producer启动前，需先注册Topic，仅注册过Topic的才可以发送消息；\n3）优化Producer配置Topic的逻辑，由原先伴随SendMessage，改为Start的时候；\n4）Producer发送消息时，增加返回类型SendResult；\n5）ProducerSettings，增加配置SendMsgTimeout，用于发送确认超时设置，默认3秒；\n6）增加Producer和Consumer是否运行的逻辑验证；\n7）路由Hash算法，改为Crc16算法；\n8）IMessageTransportationContext 属性ExchangeName改为Topic，属性QueueName改为QueueIndex；\n9）增加Pull模式。\n```\n\n### 1.1.3\n\n```plain\n1）支持延迟消息，需启用插件 rabbitmq_delayed_message_exchange；\n2）Producer、Consumer初始化时，增加autoConfig参数，仅为true时才会配置Exchange、Queue和Bind。\n```\n\n### 1.0.1\n\n```plain\n1）支持集群消费：相同消费组，不同消费者之间实现负载均衡，一个队列有且仅有一个消费者；\n2）支持广播消费：不同消费组，可以消费同一个消息。\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fberkaroad%2Frabbitmqtopic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fberkaroad%2Frabbitmqtopic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fberkaroad%2Frabbitmqtopic/lists"}