- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在调查此问题,但我还是想问问。如果没有回答,我会在发现后发布答案。
应用程序调用 RabbitHutch.CreateBus 来创建 IBus/IAdvancedBus 的实例,以将消息发布到 RabbitMQ。返回实例,但 IsConnected 标志设置为 false(即连接重试在后台完成)。当应用程序为特定请求提供服务时,调用 IAdvancedBus.PublishAsync 以在总线仍未连接时发布消息。在负载很大的情况下,对应用程序的请求最终会超时,因为总线永远无法连接到 RabbitMQ。
在处理请求时与 RabbitMQ 的连接丢失时会观察到相同的行为。
EasyNetQ 如何处理总线断开时发布消息的尝试?
在建立连接之前,消息是否在内存中排队?如果是这样,它是否会在达到某个限制后处理消息?这是可配置的吗?
还是强制总线尝试连接到 RabbitMQ?
还是完全转储消息?
PublisherConfirms 是否打开影响行为?
最佳答案
我无法测试上述所有场景,但看起来在尝试发布到 RabbitMQ 之前,EasyNetQ 正在检查总线是否已连接。如果不是,它或多或少会进入连接循环,如下所述:https://github.com/EasyNetQ/EasyNetQ/wiki/Error-Conditions#there-is-a-network-failure-between-my-subscriber-and-the-rabbitmq-broker
随着负载的增加,连接循环似乎正在失控,因为我们的基础设施或配置已损坏,因此没有一个能够连接到 RabbitMQ。为什么我们会超时我还没有确定,但我怀疑当多个连接循环尝试同时连接时可能会出现并发问题。
我也怀疑关闭 PublisherConfirms 是否有帮助,因为我们无法发布消息,因此不等待 RabbitMQ 的确认。
我们的解决方案:
那么为什么我没有得到这个问题的明确答案呢?事实是,严格来说,目前我们试图发布的消息并不是关键任务。如果我们的配置有误,运行健康检查时部署将失败,我们基本上会中止部署。如果 RabbitMQ 由于某种原因变得不可用,我们可以不发布这些消息。
此外,为避免超时,我们将使用断路器结束消息发布,以在我们检测到应用程序与 RabbitMQ 之间的电路打开时停止消息发布。粗略地说,它的工作原理如下:
var bus = RabbitHutch.Create(...).Advanced;
var rabbitMqCircuitBreaker = new CircuitBreaker(...);
rabbitMqCircuitBreaker.AttemptCall(() => {
if (!bus.IsConnected)
throw new Exception(...);
bus.Publish(...);
});
请注意,当 IsConnected 标志设置为 false 时,我们通过抛出异常来通知我们的断路器存在问题。如果在配置的时间段内异常被抛出 X 次,电路将打开,我们将停止尝试在配置的时间内发布消息。我们认为这是可以接受的,因为如果 RabbitMQ 可用,连接应该非常快并且 99.xxx% 的时间都可用。另外值得注意的是,总线是在我们的应用程序启动时创建的,而不是在每次调用之前创建的,因此在有效场景中实际设置标志之前检查标志的可能性非常低。
目前为我们工作,如有任何额外信息,我们将不胜感激。
关于c# - 当使用 EasyNetQ 发布消息并且总线断开连接时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28880775/
我使用 EasyNetQ 为 RabbitMQ 实现了一个简单的客户端。连接后,我收到通知“队列模型关闭”。这是我的代码: var _bus = RabbitHutch.CreateBus(Strin
我使用 EasyNetQ 为 RabbitMQ 实现了一个简单的客户端。连接后,我收到通知“队列模型关闭”。这是我的代码: var _bus = RabbitHutch.CreateBus(Strin
我正在考虑使用 EasyNetQ 与 RabbitMQ 进行交互,想知道它是否可以支持以下情况: 使用一些任意参数(例如 x-message-ttl)在外部声明队列 使用 EasyNetQ 的客户端代
在我的测试应用程序中,我可以看到处理异常的消息被自动插入到默认的 EasyNetQ_Default_Error_Queue 中,这很棒。然后我可以使用 Hosepipe 成功地转储或重新排队这些消息。
我正在使用EasyNetQ,需要重试原始队列中的失败消息。问题是:即使我成功地增加了TriedCount变量(在每个msg的正文中),当EasyNetQ在异常发生后将消息发布到默认错误队列时,更新的T
我目前正在调查此问题,但我还是想问问。如果没有回答,我会在发现后发布答案。 问题如下: 应用程序调用 RabbitHutch.CreateBus 来创建 IBus/IAdvancedBus 的实例,以
我们使用 RabbitMQ 在 C# .Net(EasyNetQ 客户端)中对消息进行排队。 我想要一个消费者应用程序(C# 控制台应用程序)监听一个队列并为每种消息类型提供多个处理程序。 我实现了这
当发生错误消息发布到默认 EasyNetQ_Default_Error_Queue 时,我有四个消费者是否可以让每个队列消费者编写自己的错误交换 例如; Queue Name : A Error
我正在我的软件中尝试一些边缘情况。所以我创建了一个非常简单的测试环境: 在 CentOS 7 上运行的 RabbitMQ 服务器 在 CentOS 7 下运行的 C# 中针对 .NETCore 2.1
我最近发布了以下问题... Custom Error Queue Name when using EasyNetQ for RabbitMQ? ... 并提供了有关如何在使用 EasyNetQ 时使用
我在 C# 中使用 RabbitMQ 和 EasyNetQ 库。我在这里使用发布/订阅模式。我还有一些问题希望有人能帮助我解决: 如果在使用消息时出现错误,它会自动移至错误队列。我如何实现重试(以便它
当发布者希望消息得到答复时,如何确保在您将其扩展时它只会获得(对自己的消息)相关的答复? 我们有一个客户端进程发布一条消息供服务器进程回答。此外,我们有一个“监听器”进程,它只需要在不发布任何内容的情
我正在使用 EasyNetQ,我想知道如何获取现有的 IExchange和 IQueue不提前订阅? 在 IAdvanceBus我只能看到: ExchangeDeclareAsync QueueDec
我是消息传递新手,目前正在使用 RabbitMQ 进行调查作为我们系统架构的一部分,在不同服务之间提供消息传递。我有一个basic RabbitMQ example工作并且它可以通过总线传输基本的文本
我正在尝试使用 EasyNetQ 连接到 RabbitMQ。RabbitMQ 位于远程虚拟机上。 _rabbitBus = RabbitHutch.CreateBus( string.Form
所以我有以下架构:Angular SPA(单页应用程序)执行对 .NET Web API Controller 的调用,后者将消息发布到 Publisher EasyNetQ 窗口服务,后者将异步请求
谁能指导我找到适用于 Unity 5.x (.Net 3.5) 项目的 EasyNetQ 的正确版本? 我有一个针对 .Net framework 3.5(Unity 3.5 .net 子集基类库)的
与其让我未处理的异常进入EasyNetQ_Default_Error_Queue,我想知道是否有一种方法可以明确说明应该用于给定应用程序的错误队列的名称,因此错误不会t ALL 最终都在这个 Easy
我正在尝试将 EasyNetQ 与 Ninject 结合使用来记录消息。 我已经设法将 Ninject 设置为 EasyNetQ DI(我认为),但是当消息到达没有无参数构造函数的处理程序时(例如,我
我可以使用以下代码成功发布消息: using (IAdvancedBus bus = RabbitHutch.CreateBus("host=192.168.153.128:5672;
我是一名优秀的程序员,十分优秀!