【发布时间】:2017-10-30 01:18:00
【问题描述】:
我目前有一个由多个服务组成的 Service Fabric 应用程序。我想要实现的是一种队列机制这样一个服务可以将消息发布到一个队列,另一个服务可以从同一个队列接收消息。
以下不起作用(对于 Listener 服务,没有什么可以出队):
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 服务添加依赖项(因此增加了整个系统的故障概率)
- 成本更高
- 更复杂的部署
- 等
【问题讨论】:
标签: c# azure queue azure-service-fabric service-fabric-stateful