我目前有一个由多个服务组成的Service Fabric应用程序。我想实现的是一种排队机制,以便一个服务可以将消息发布到队列中,另一个服务可以从同一队列接收消息。
以下方式不起作用(对于侦听器服务,没有任何内容可出队):
PublisherService:
看起来队列的范围似乎仅限于单个服务。这似乎不是文档中指定的限制。
因此,我的问题是:
- 这实际上是一些未记录的限制吗? - 或者上述代码有问题吗? - 我该如何实现上述情况(一个服务向队列添加消息,另一个服务从同一队列检索消息)?
显然,我可以使用 Azure 服务总线,但由于以下几个原因,我无法使用:
- 在我的实际场景中,我将有多个队列(数量可变),因此需要按需创建服务总线队列(这不是一项非常快速的操作) - 增加了对另一个 Azure 服务的依赖(因此增加了整个系统的故障概率) - 成本更高 - 部署更加复杂 - 等等。
以下方式不起作用(对于侦听器服务,没有任何内容可出队):
PublisherService:
protected override async Task RunAsync(CancellationToken cancellationToken)
{
var myQueue = await StateManager.GetOrAddAsync<IReliableQueue<string>>("fooQueue");
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
using (var tx = this.StateManager.CreateTransaction())
{
// Put some message in the queue
await myQueue.EnqueueAsync(tx, "Foobar");
await tx.CommitAsync();
}
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
}
ListenerService
:
protected override async Task RunAsync(CancellationToken cancellationToken)
{
var myQueue = await StateManager.GetOrAddAsync<IReliableQueue<string>>("fooQueue");
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
using (var tx = this.StateManager.CreateTransaction())
{
var result = await myQueue.TryDequeueAsync(tx);
if (result.HasValue)
{
ServiceEventSource.Current.ServiceMessage(this.Context, "New message receieved: {0}", result.Value.ToString());
}
await tx.CommitAsync();
}
await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
}
}
看起来队列的范围似乎仅限于单个服务。这似乎不是文档中指定的限制。
因此,我的问题是:
- 这实际上是一些未记录的限制吗? - 或者上述代码有问题吗? - 我该如何实现上述情况(一个服务向队列添加消息,另一个服务从同一队列检索消息)?
显然,我可以使用 Azure 服务总线,但由于以下几个原因,我无法使用:
- 在我的实际场景中,我将有多个队列(数量可变),因此需要按需创建服务总线队列(这不是一项非常快速的操作) - 增加了对另一个 Azure 服务的依赖(因此增加了整个系统的故障概率) - 成本更高 - 部署更加复杂 - 等等。