C# - 限制消息队列

标签 c# message-queue

我有将消息发送到 MessageQueue 的代码。

_queue.Send(new Message(myData));

此队列位于本地计算机上,并且从其中 Receive() 的线程位于同一进程中。

如果消息插入速度快于提取速度,会发生什么情况? Send() 会阻塞吗? 有没有办法让我在向其中发送更多事件之前知道 MessageQueue 是否已满? (我现在更愿意只记录 myData 而不是发送事件)。

谢谢, 塞拉。

最佳答案

简短回答:做简单的事情,不要限制发送。

长答案: 仅当分配用于保存的磁盘空间不足时,消息队列才会真正变满 - 这同时您的日志记录也将空间不足。消息队列非常擅长保存您尚未准备好处理的数据。不要限制发送。如果您关心系统管理和磁盘空间,那么您可能更愿意依赖 Window 出色的系统监控工具和磁盘空间使用阈值警报。您无需为您的应用程序重新设计它。

除非您在仅内存模式下运行队列,否则可能没有必要。如果您不能足够快地处理消息,那么您肯定有足够的时间让队列管理器将消息保存到磁盘。如果您要扩展到许多服务器上的许多消费者进程并且队列管理器上的磁盘 IO 成为瓶颈,那么您应该只考虑在仅内存模式下运行队列。同一台机器上的一个进程与这种情况相差甚远。 让队列管理器做它最擅长的事情。不要过早优化。

如果您实现指定的服务质量(例如每秒 X 条消息)并为客户处理更高质量的服务收取更多费用,则在接收端进行限制。我已经使用信号量成功完成了此操作,该信号量的资源限制等于每秒消耗的消息数。每个消费者线程都会拍摄消息开始时间的快照,处理 1 条消息,然后等待一秒结束,然后再放弃信号量。这样,如果消息处理时间超过 1 秒,则线程池可以增长以适应服务质量,但不会超出服务质量。

祝你好运!

关于C# - 限制消息队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3976693/

相关文章:

c# - 为什么在调用者而不是有问题的行上抛出异常

c# - sqlite-net的通用方法

c# - 将集合添加到 BlockingCollection

c# - 如何获取 DataGridView 中的当前单元格位置 x 和 y?

azure - 如何获取队列消息类型

c# - 使用 Entity Framework 的代码优先在保存时抛出 DbUpdateException

c - 消息被覆盖 - C

c++ - 处理消息太慢,导致 UI 不稳定、无响应 - 如何使用多线程来缓解这种情况?

queue - RabbitMQ - 消息传递顺序

java - 有生存时间的消息队列