【问题标题】:RabbitMQ C# Client Scalable?RabbitMQ C# 客户端可扩展?
【发布时间】:2019-04-28 09:55:33
【问题描述】:

查看官方.net客户端代码,在几个地方看到了lock的语句。这引发了一个内部问题,即这对性能有多大影响。

我当前的解决方案是一个使用 graylog 进行日志记录的网络应用程序,它的接收器是一个兔子队列。一个关键路径请求可能会导致几十个日志,理想情况下它应该在 500 毫秒内运行。在高峰时刻,我们预计每秒处理 3-5 个请求和 1-2 数百个其他请求。

现在,连接和模型基本上是单例的,我的问题是:当我们遇到重负载时,我应该对那些锁有多担心?有知道死锁的地方吗?

【问题讨论】:

  • 我相信指向特定锁定语句的链接和一些示例会有所帮助。
  • 请详细说明lock语句:是在发布中还是在接收中?

标签: c# rabbitmq scalability


【解决方案1】:

一般来说,锁本身比较便宜,可以在这里阅读:How expensive is the lock statement?

简答:50ns

所以实际的问题是:实际上锁定的部分是什么,这有关系吗?

我的假设是它是将消息发布到队列的部分(尽管如果您详细说明它会有所帮助)。

所以,我没有深入研究代码,但由于它纯粹是在客户端,您应该能够毫无困难地水平扩展这些客户端。

【讨论】:

  • 横向比例不是我关心的问题......我关心的是让应用程序在 16 个核心盒上运行 200 个线程,并让它们将自己锁定在顺序代码上转换并发代码......当然,单独打开/关闭每个请求的连接/模型会打破 700 毫秒的阈值...
  • @Leonardo 你对它进行了基准测试吗?如果你担心线程会互相死锁,让它们写入一个由 Thread201 读取的 ConcurrentQueue,并且只让 Thread201 写入 RabbitMQ。
  • 并行工作负载的 CPU 密集程度如何?如果一个线程完成的工作可以使单个内核饱和,那么生成 200 个线程将由于上下文切换而大大降低性能。在这种情况下,您应该最多生成 16 个线程,或者让 ThreadPool 为您完成。
  • @AlexanderPope 到目前为止,该应用程序运行良好,有 200 个工作线程和 300 个 IO 线程...当达到 150-170 时,其他指标会触发自动缩放并弹出一个新框... concurrentQueue 的问题在于,如果发生崩溃,重要的日志数据可能会丢失
  • @Leonardo:有一些关于为典型用途调整一些设置的文档:rabbitmq.com/networking.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多