我目前有一個服務結構應用程序由多個服務組成。我試圖實現的是排隊機制,因此一個服務可以將消息發佈到隊列,而另一個服務可以接收來自同一隊列的消息。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的服務(這樣增加了整個系統的失效概率)
- 花費更多
- 更復雜的部署
- 等
謝謝,這是有道理的。我不確定我會選擇哪種方式(Azure存儲隊列或遠程通信)。每個人都有自己的優點/缺點。再次感謝,這非常有幫助。 – ken2k
但話又說回來,你正在建設一個貧窮的芒服務總線/ Azure存儲隊列自己。 - 這意味着這不是使用ReliableQueue的正確方法嗎? – AsValeO
@AsValeO你的意思是「正確的方式」。如果您將它用於其設計用途:將數據存儲在使用位置,即位於單一有狀態服務中。你不能把它變成別的東西,就像一個跨多個服務的隊列一樣。 –