0

我使用的是 NSB 版本 6.2 和 RabbitMQ 版本 4。我使用的是 RabbitMQTransport。我的 RabbitMQ 服务器位于 Azure 的虚拟机中。当我发送消息时,有时我会丢失消息而没有任何错误。

这是我的 NService 总线配置。

            EndpointConfiguration config = null;
        string endpointName = ConfigurationManager.AppSettings.Get("NServiceBus.EndpointName");
        config = configEndPoint.IsNullOrDefault() ? new EndpointConfiguration(endpointName) : configEndPoint;
        int maximumConcurrencyLevel = ConfigurationManager.AppSettings.Get("NServiceBus.TransportConfig.MaximumConcurrencyLevel").ToInt();
        config.LimitMessageProcessingConcurrencyTo(maximumConcurrencyLevel);
        int numberOfRetries = ConfigurationManager.AppSettings.Get("NServiceBus.TransportConfig.NumberOfRetries").ToInt();
        var recoverability = config.Recoverability();
        recoverability.Immediate(
            customizations: immediate =>
            {
                immediate.NumberOfRetries(numberOfRetries);
            });

        DefaultFactory defaultFactory = LogManager.Use<DefaultFactory>();
        defaultFactory.Directory(this.DatabusDirectory);
        defaultFactory.Level(LogLevel.Error);

        config.IdealinkJsonSerializer();
        config.UsePersistence<InMemoryPersistence>();

        config.SendFailedMessagesTo("error");
        config.AuditProcessedMessagesTo("audit");

        // configure transport
        config.UseTransport<RabbitMQTransport>().Transactions(TransportTransactionMode.ReceiveOnly);
         var endpointInstance = Endpoint.Start(endpointConfiguration).GetAwaiter().GetResult();
4

1 回答 1

4

除了持久性之外,您的端点的配置看起来都很好。持久性用于底层传输本身不支持的功能。对于 RabbitMQ,没有本地机制来发送延迟消息。在 4.3 版本之前,持久性用于存储超时。如果使用InMemoryPersistence,端点重新启动后将不会保留任何信息。可恢复性功能需要超时,特别是延迟重试从 4.3 及更高版本开始,超时不需要持久性,但InMemoryPersistence仍不应使用。您可以根据手头的技术和场景选择其他持久性。

请注意,版本 4.0.0 不在受支持的版本之下。您应该更新到 4.3.x 或 4.4.x 并验证行为以查看您是否注意到消息丢失。如果您仍然丢失消息,我建议提供更多详细信息,例如日志文件和处理程序代码。如果您无法公开分享,请提交支持案例

希望有帮助。

于 2017-10-18T20:13:14.423 回答