几个月前(当我不熟悉Azure Queues和SDK工具时)我用Google搜索"我该怎么做"和"我该怎么做"......这就是我今天所处的位置:
我正在使用QueueClient(Microsoft.ServiceBus.Messaging - Microsoft.ServiceBus.dll)从Azure队列接收邮件.
在我的同一个程序中,我也使用MessageSender(来自相同的命名空间和dll)将消息发送到Azure队列.
我的程序必须跟踪a Dictionary<string, QueueClient>和a Dictionary<string, MessageSender>- 这比它应该更复杂.
现在我对Azure SDK更熟悉了......我意识到这个QueueClient类可以发送和接收 ......那么为什么我要跟踪2个对象,而第一个可以同时执行这两个对象?
有没有理由使用MessageSender该类而不是QueueClient类?
如果我需要发送和接收,我不应该只使用该QueueClient课程吗?
如果我使用.NET SDK从MVC应用程序添加Windows Azure队列项或blob存储引用,那么每个组件应该保留多长时间?
对于队列,我们有CloudStorageAccount,CloudQueueClient和CloudQueue.
对于blob存储,我们有CloudStorageAccount,CloudBlobClient和CloudBlobContainer.
我假设最好每个Web请求创建一个组件,但现在不创建每个项目的成本.我再次假设使用单例生命周期保持客户端之间的Web请求不是一个好的计划,但没有任何进展.
我试图找到我应该从Azure存储队列触发的Azure WebJobs QueueTrigger方法的错误.
我已经阅读了几个文档(如博客文章/ msdn文章).但我还不清楚.
主要问题/误解方面:
Azure存储控制台应用程序App.config或Windows Azure配置(门户网站)的连接字符串的名称应该是什么.到目前为止,我在两个地方都设置了以下名称.
这是我的WebJobs控制台应用程序代码.
static void Main()
{
JobHost host = new JobHost();
host.RunAndBlock();
}
public static void CreateLeague([QueueTrigger("temp")] string msg)
{
var task = JsonConvert.DeserializeObject<QueueTask>(msg);
if (task.TaskType == QueueTask.TaskTypes.Pdf)
RenderPdf(task.Id);
}
Run Code Online (Sandbox Code Playgroud)
此控制台应用程序在我的Azure网站上持续运行.
我可以访问其"调试"页面,我可以切换输出,我看到它已启动/运行.
我添加队列的代码(来自我的ASP.NET MVC应用程序):
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]);
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
CloudQueue queue = queueClient.GetQueueReference("temp");
queue.CreateIfNotExists();
Common.QueueTask task = new Common.QueueTask();
task.TaskType = Common.QueueTask.TaskTypes.Pdf;
task.Id = p.Id;
CloudQueueMessage msg = new CloudQueueMessage(JsonConvert.SerializeObject(task) );
queue.AddMessage(msg);
Run Code Online (Sandbox Code Playgroud)
执行此代码,并将队列添加到我的存储帐户.但是他们并没有从WebJobs中"出列"或阅读.
我在azure上有一个webjob,带有QueueTrigger.工作很长(超过30分钟)
public async static Task ProcessQueueMessageAsync([QueueTrigger(QUEUENAME)] string iJobId)
{
//doing my long job
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在触发后删除队列中的消息.消息变为不可见,直到时间跨度(默认为30秒)到来.我的工作时间少得多.所以我想我必须在触发器方法的开头删除该消息.当你使用GetMessage()方法循环而不是触发时,我发现如何做到这一点.但是如何用触发器来做,因为我没有运行的消息对象.DeleteMessage()?
我正在尝试在本地运行天蓝色队列触发函数。我安装了 Azure 存储模拟器并运行命令“AzureStorageEmulator.exe init”以在“(localdb)\MSSQLLocalDB”服务器上创建“AzureStorageEmulatorDb59”数据库。
在我的具有队列触发功能的azure函数项目中,我有一个local.settings.json文件。应该在该文件中添加哪些设置以及连接字符串到底应该是什么以及应该在哪里添加它?下面提到我的队列触发功能。应该添加什么来代替“QueueTrigger”属性后面提到的“my-queue”?请在这件事上给予我帮助
[FunctionName("TestQTFunction")]
public static void Run([QueueTrigger("my-queue", Connection = "AzureQueueConnectionString")]string myQueueItem, ILogger log)
{
// Do something
}
Run Code Online (Sandbox Code Playgroud) 我计划实现一个可以启动多个线程的天蓝色工作角色。每个线程可能想要读取或写入存储队列。对于不同的工作者角色实例,竞争情况并非如此。但是,从同一辅助角色中运行的不同线程同时访问同一队列是否安全?
我正在使用Azure Service Bus来管理带有webrole和workerrole的消息.
我需要知道如何在不使用循环的情况下立即从队列中获取多条消息.
servicebus azure azure-worker-roles azure-queues azureservicebus
我正在开发一个具有各种类型通知的应用程序.通知示例:
我想将所有这些都绑定到SignalR,以便任何连接的客户端实时获得更新.
就架构而言 - 现在该应用程序完全位于Azure网站上托管的单一解决方案中.每种通知类型的触发器都存在于此应用程序中.
当触发器被击中时,我想告诉signalR,"嘿,将此消息发送给以下客户端"以及userIds列表.我假设可以基于userId来识别连接的客户端......我假设send message to clients应该在Web应用程序之外执行该过程,以便不会减慢MVC应用程序或者丢失数据的风险打破异步调用.第一个问题 - 这些假设是否正确?
假设如此,这意味着我需要像专用的web/worker角色那样向客户端发送消息.我可以将来自我的Web应用程序的消息直接传递给此过程,但是如果该过程死亡会发生什么?弹性问题让我相信传递消息的正确方法是通过某种队列.第二个问题 - 这是一个有效的思路吗?
假设是这样,这意味着我可以使用一个好的'Azure SQL数据库作为队列,但似乎有一些专门的(也许更便宜的)服务来处理消息队列,例如:
http://www.windowsazure.com/en-us/develop/net/how-to-guides/queue-service/
第三个问题:这应该用作signalR的排队机制吗? 我有兴趣在将来使用Redis进行缓存...... Redis会比队列服务更好还是更差?
最后的问题:
我试图在这里说明我提出的架构:

我在这里最不清楚的是MVC应用程序将如何知道何时排队,或者SignalR进程将如何知道何时进行广播.MVC应用程序应该盲目排队,而不关心连接的客户端吗?这似乎在队列中引入了大量浪费的空间,并且在工作者角色中浪费了周期,因为很少一部分客户端将被连接.
我能想到的唯一其他方法是以某种方式让MVC应用程序可以看到SignalR进程,以查看客户端是否已连接......如果是,则为Enqueue.这让我感到不舒服,因为这意味着我必须在图表上为每个被击中的触发器击中红线,即使完成异步 - 让我担心性能和可靠性.
可扩展,高性能SignalR消息广播的推荐架构是什么? 绩效是重中之重,紧随其后的是成本.
奖金问题:
有时,Azure 队列中有一些消息不是由 Azure Functions 负责的,并且在 StorageExplorer 中也看不到。这些消息的创建没有任何可见性延迟。
有什么方法可以知道这些消息包含什么,以及为什么它们不被我们的 Azure Functions 处理?
Microsoft Azure 提供 Azure SignalR 服务和 Azure 队列服务。我找不到的是使用其中一种与另一种的优点/缺点是什么。
您能否在此处提供这些差异,或者提供对它们进行比较的文档或网页的链接,我无法在此处或使用 Google 找到任何内容。
我们有一个 Web 应用程序和一个移动应用程序,它们连接到 Azure Functions。
我们需要添加向连接打印机的远程位置的 Windows 服务发送消息的功能。
最初,我正在考虑使用具有订阅队列的 Azure 服务总线,以便这些远程系统可以订阅一个队列,寻找消息供它们使用过滤器进行处理。
现在有人提出使用 Azure SignalR,所以我试图了解 Microsoft 的两种产品之间的差异,以便我知道哪一种更具可扩展性。
Web 说打印此项目调用 REST Azure Functions 来生成要打印的内容,然后该信息需要到达远程位置才能打印。这些网络未连接,因此无法直接与打印机通信,这就是考虑使用 Azure 服务总线消息或 Azure SignalR 消息传递的原因。
azure-queues ×10
azure ×9
c# ×4
signalr ×2
.net ×1
asp.net-mvc ×1
queuetrigger ×1
servicebus ×1