Service Fabric StatelessService多监听器共存时内部Broker消息投递失败
问题描述
在本地单节点Windows集群中部署了一个无状态服务(StatelessService),核心功能为监听并处理Azure Service Bus消息,同时希望该服务能监听集群内部的SoCreate Pub/Sub Broker。
正常场景
当单独注册不同类型的监听器时(两个自定义Service Bus监听器,或一个类型为FabricTransportServiceRemotingListener的内部Broker监听器),均能正常工作。但同时注册三个监听器时,内部Broker无法向StatelessService投递消息。
Service Bus监听器
通过为两个订阅分别注册自定义Service Bus监听器(实现ICommunicationListener接口),完成Azure Service Bus消息订阅者的配置,通过重写CreateServiceInstanceListeners方法实现:
private readonly ServiceBusHandler1 _handler1 = new(); private readonly ServiceBusHandler2 _handler2 = new(); protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() { var serviceInstanceListeners = new List<ServiceInstanceListener>(); serviceInstanceListeners.Add(new ServiceInstanceListener(context => new ServiceBusCommunicationListener(_handler1, /*some other input params*/), name: "ServiceBusListener1")); serviceInstanceListeners.Add(new ServiceInstanceListener(context => new ServiceBusCommunicationListener(_handler2, /*some other input params*/), name: "ServiceBusListener2")); return serviceInstanceListeners; }
FabricTransportServiceRemotingListener监听器
同理,通过以下方式完成内部Broker监听器的注册,可正常工作:
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() { var serviceInstanceListeners = new List<ServiceInstanceListener>(); serviceInstanceListeners.Add(new ServiceInstanceListener(context => new FabricTransportServiceRemotingListener(context, this), name: "SubscriberStatelessServiceRemotingListener")); return serviceInstanceListeners; }
异常场景
当合并注册所有监听器时,内部Broker无法投递队列中的消息:
private readonly ServiceBusHandler1 _handler1 = new(); private readonly ServiceBusHandler2 _handler2 = new(); protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() { var serviceInstanceListeners = new List<ServiceInstanceListener>(); serviceInstanceListeners.Add(new ServiceInstanceListener(context => new ServiceBusCommunicationListener(_handler1, /*some other input params*/), name: "ServiceBusListener1")); serviceInstanceListeners.Add(new ServiceInstanceListener(context => new ServiceBusCommunicationListener(_handler2, /*some other input params*/), name: "ServiceBusListener2")); serviceInstanceListeners.Add(new ServiceInstanceListener(context => new FabricTransportServiceRemotingListener(context, this), name: "SubscriberStatelessServiceRemotingListener")); return serviceInstanceListeners; }
我意识到可能需要向Broker包团队咨询,但希望先确认是否存在Service Fabric相关的遗漏配置或问题。
内容的提问来源于stack exchange,提问作者Isak Engström
相关产品推荐
相关产品推荐

