只是一个关于Azure应用程序的快速问题.如果我有许多需要通信的Web和Worker角色,文档说要使用Azure队列服务.
但是,我刚刚读到新的.NET Service Bus现在也提供了队列.这些看起来更强大,因为它们似乎提供了更加详细的API.虽然.NSB看起来更有趣,但它有几个问题让我在分布式应用程序中使用它时会很谨慎.(例如,Queue Expiration ...如果我不能保证队列将按时更新,我可能会失去它!).
有没有人有任何经验使用这两种技术中的任何一种,并且可以提供何时选择其中一种的建议.
我怀疑虽然服务总线看起来更强大,但我的用例实际上只是让Web/Worker角色能够相互通信,Azure Queue Service就是我所追求的.但是我真的在寻找确认之前,然后自己进入角落:-)
提前致谢.
在休息时间读了两个系统.它看起来像.NET服务总线更专门用于集成系统,而不是提供通用的可靠消息系统.Azure队列是分布式的,因此可靠且可扩展,其中.NSB队列不是,因此更适合Azure本身托管的代码.
谢谢你的回复.
我正在尝试使用Azure WebJob从Azure ServiceBus队列中读取消息,但它正在抛出异常:
Unhandled Exception: System.InvalidOperationException: Found 2 DNS claims in authorization context.
Run Code Online (Sandbox Code Playgroud)
我已经设置了名为"AzureWebJobsServiceBus","AzureWebJobsDashboard"和"AzureWebJobsStorage"的正确连接字符串
WebJob程序代码已更新为使用JobHostConfiguration:
class Program
{
static void Main()
{
var config = new JobHostConfiguration();
config.UseServiceBus();
var host = new JobHost(config);
host.RunAndBlock();
}
}
Run Code Online (Sandbox Code Playgroud)
而实际的Job方法
public class Functions
{
public async static Task ServiceBusResizeRequest(
[ServiceBusTrigger("blah")] string message,
TextWriter log
)
{
await log.WriteLineAsync("got message " + message);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以通过单独的控制台应用程序成功创建和写入队列.
但是当我运行webjob应用程序时,它会抛出异常.
有任何想法吗?
编辑:使用.net 4.6.1
azure azureservicebus azure-servicebus-queues azure-webjobs azure-webjobssdk
所以场景是我使用SB队列来限制对其他服务的传出回调.回拨给其他服务的标准问题之一是它们可能会因无法控制的时间而停机.假设我检测到目标已关闭/没有响应,放弃该消息的最佳模式是什么,以便它不会立即重新出现在队列中?
以下是我要么意识到的,尝试过或正在考虑的一些方法:
显然,如果我只是使用BrokeredMessage::Abandon()该消息将被解锁并重新放回队列.对于这种情况以及我想要避免的情况,这显然是不可取的.
如果我只是忽略了我遇到错误并且从不调用Abandon的事实,这将使它不会立即出现,但我真的没有细致的控制,直到它再次显示多久,我想实现一个腐朽的重试策略.
我想也许我可以调用BrokeredMessage::Abandon(IDictionary<string, object>)并以某种方式更新ScheduledEnqueueTimeUTC属性,但我已经尝试了这个并且除了最初发送消息之外似乎没有办法影响该属性.有道理,但值得一试.
我考虑过只是BrokeredMessage::Complete()在这种情况下使用,实际上只是用属性集将消息的新副本排入队列ScheduledEqueueTimeUTC.
最后的子弹几乎看起来太过沉重,但我得出结论,考虑到队列的固有性质,它可能是正确的答案.我只想到在Azure SB队列中可能有一个更好的方法来实现这一点,我很想念.
我知道有一种方法可以确定Azure队列(存储帐户)中的邮件数量(或近似数量); 但有没有办法查询Azure Service Bus队列中的待处理消息数?
我们在项目中使用服务总线队列.当管理员选择清除队列时,我们需要一种功能来从队列中删除所有消息.我在网上搜索但找不到任何在QueueClient课堂上做这个的功能.
我是否必须逐个弹出所有消息,然后将它们标记为完成以清除队列或者有更好的方法吗?
QueueClient queueClient = _messagingFactory.CreateQueueClient(
queueName, ReceiveMode.PeekLock);
BrokeredMessage brokeredMessage = queueClient.Receive();
while (brokeredMessage != null )
{
brokeredMessage.Complete();
brokeredMessage = queueClient.Receive();
}
Run Code Online (Sandbox Code Playgroud) 我有一个Azure辅助角色,负责检查4个服务总线队列.目前,我只是循环方法来手动检查队列.
while(true)
{
//loop through my queues to check for messages
}
Run Code Online (Sandbox Code Playgroud)
Azure SDK 2.0具有监听消息而不是轮询消息的能力.但是我见过的每个例子都使用Console.ReadKey()的控制台应用程序.有没有办法让工作者角色坐下来等待消息呢?
我试过了:
public override void Run()
{
_queueProcessors.ForEach(x => x.OnMessage(Process);
}
Run Code Online (Sandbox Code Playgroud)
其中_queueProcessors是QueueClients的列表,而Process是处理消息的私有方法.但是,worker角色会注册它们然后重新启动.
所以任何人都知道如何让队列客户端坐下来等待消息?
c# azure azure-worker-roles azureservicebus azure-servicebus-queues
我想通过一些特定的活动访问工作流程中的服务总线队列和主题.
我找不到适合这种情况的任何东西(这篇MSDN文章和Roman Kiss的这篇文章)是最接近的.
我想设计一个自定义活动,使用QueueClient异步接收代理消息,使用使用async/await模式实现的BeginReceive方法(请参阅我的问题).
首先,我想问一下,为什么我更喜欢建议的方法(改编的WCF)而不是我想要的方法(使用QueueClient).
然后,我将非常感谢以持久友好的方式设计它.
更新:
这是我到目前为止所尝试的:
public class AsyncReceiveBrokeredMessage : AsyncCodeActivity<BrokeredMessage>
{
[RequiredArgument]
public InArgument<string> ConnectionString { get; set; }
[RequiredArgument]
public InArgument<string> Path { get; set; }
protected sealed override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
{
var connectionString = this.ConnectionString.Get(context);
var path = this.Path.Get(context);
var queueClient = QueueClient.CreateFromConnectionString(connectionString, path);
var cts = new CancellationTokenSource();
context.UserState = new ReceiveState
{
CancellationTokenSource = cts,
QueueClient = queueClient
};
var task = …Run Code Online (Sandbox Code Playgroud) workflow-foundation-4 async-await c#-5.0 azure-servicebus-queues
是否有办法从 Azure 门户中的 Azure 服务总线队列中删除/清除活动/死信消息?目前,我们已经向队列发送了几条消息,而活动消息和一些死信消息都毫无意义地保留在那里,并且我们的服务总线订阅者没有以某种方式触发,因此我们想删除这些消息以使我们的队列又干净了。为了等到服务总线在过期后删除这些消息,我们可以自己手动删除它们吗?
我正在开发一个WebJob使用服务总线队列,但我没有Azure帐户.
是否存在一些Service Bus模拟器来测试webjob?我需要取队列输入来模拟[ServiceBusTrigger]
有人可以提供有关使用Azure Service Bus OnMessageOptions.AutoRenewTimeout的更多指导 http://msdn.microsoft.com/en-us/library/microsoft.servicebus.messaging.onmessageoptions.autorenewtimeout.aspx
因为我没有找到关于此选项的大量文档,并且想知道这是否是更新消息锁的正确方法
我的用例:
1)消息处理队列的锁定持续时间为5分钟(允许的最大值)
2)消息处理器使用OnMessageAsync消息泵从队列中读取(使用ReceiveMode.PeekLock)长时间运行的处理可能需要10分钟才能处理消息,然后再手动调用msg.CompleteAsync
3)我希望消息处理器自动更新它的锁定,直到预期完成处理的时间(~10分钟).如果在此期间之后尚未完成,则应自动释放锁定.
谢谢
- 更新
我从来没有最终获得有关AutoRenewTimeout的更多指导.我最终使用自定义MessageLock类,根据计时器自动更新消息锁.
请参阅要点 - https://gist.github.com/Soopster/dd0fbd754a65fc5edfa9
azure ×9
.net ×1
async-await ×1
azure-queues ×1
c# ×1
c#-5.0 ×1
emulation ×1
queue ×1
servicebus ×1