我正处于设计基于Azure的应用程序的早期阶段.考虑到我可能期望的需求变化,吸引我进入Azure的一个原因是可扩展性.因此,我试图保持松散耦合,以便我可以在需要时添加实例.
我在构建Azure应用程序时看到的建议包括将Web角色逻辑保持在最低限度,并在工作者角色中完成处理,使用队列进行通信以及某些后端存储(如SQL Azure或Azure表).这对我来说似乎是一个好主意,因为我可以毫无问题地扩展应用程序的任一部分或两部分.但是我很好奇是否有任何最佳实践(或者如果有人有任何经验),最好让网络角色直接与数据存储对话而不是通过队列发送数据?
我正在考虑从web角色进行简单插入的情况 - 我可以将其设置为消息,将其发送到队列中,并让工作者角色拾取并执行插入,它似乎很多双重处理.但是我也很欣赏,从长远来看,这可能是更好的情况,万一web角色不堪重负或者插件需要更复杂的逻辑.
我意识到这可能是一个案例,答案是"它完全取决于情况,检查你的绩效指标" - 但如果有人有任何想法,我会非常感激!
我的部分申请包括"聊天"系统.我为每个用户维护一个队列.发送给用户的消息被放入队列中,用户的软件定期轮询休息服务以获取新消息,此时队列被抽取消息,然后返回给用户.
该系统非常简单,运行良好,并且我需要它完成所有工作.
我的问题是; 我有数百个(很快就有数千个)队列混乱了应用程序的队列列表.
我还有其他的队列,而且令我不安的是,我不能像blob存储中的东西一样"组织"它们.
我是否遗漏了某些内容,或者我应该忽略队列列表,并依赖于这样一个事实:当用户来来往往时,我正在正确管理队列的创建和删除?
我想确保我没有多次向队列插入消息.我可以使用任何ID /名称来强制执行唯一性吗?
我需要跟踪在天蓝色存储队列中处理消息的失败尝试次数,并在N次尝试失败后删除消息.
我已搜查,但没有发现,这是否automaticaly并想知道是否有比在存储表使用计数器等方式任何特殊的性质.
我正在使用Azure Service Bus来管理带有webrole和workerrole的消息.
我需要知道如何在不使用循环的情况下立即从队列中获取多条消息.
servicebus azure azure-worker-roles azure-queues azureservicebus
据我所知,这些是唯一可用于浏览Azure表存储,队列和Blob的客户端:
那里有其他客户我不知道吗?
azure azure-storage azure-storage-blobs azure-table-storage azure-queues
使用Azure Service Bus实现基于强类型消息的路由的最简单方法是什么.
假设我们只有一个消费者并且正在使用服务总线队列,是否更容易为每种消息类型创建队列(在我们的例子中是事件消息),或者只是为所有消息创建一个队列并处理消费者的路由?
如果我们有多个消费者并且想要发布pub-sub消息,那么我们是应该为每种消息类型创建一个主题,为每个消息类型创建一个订阅,还是只为所有消息创建一个主题,然后在消费者上处理路由?
如果我使用Azure.Storage.Queue从队列中获取消息
queue.GetMessage(TimeSpan.FromMinutes(20));
Run Code Online (Sandbox Code Playgroud)
我可以设置可见性超时,但是当尝试使用Azure.WebJobs(SDK 0.4.0-beta)属性将webjob自动绑定到队列时
即
public static void ProcessQueueMessage([QueueTrigger("myqueue")] string message){
//do something with queue item
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在属性上设置可见性超时?在JobHostConfiguration()中似乎没有选项.队列.如果无法覆盖,那么它是标准的30秒吗?
我尝试异步地将Azure队列中的消息排入队列,如下所示:
private async Task EnqueueItemsAsync(IEnumerable<string> messages) {
var tasks = messages.Select(msg => _queue.AddMessageAsync(new CloudQueueMessage(msg),
null, null, null, null));
await Task.WhenAll(tasks);
}
Run Code Online (Sandbox Code Playgroud)
如果我说得对,这说"开始将一个项目排在另一个项目之后而不等待它们发布,请为每个任务保留一个参考,然后等待所有发布".
此代码在大多数情况下工作正常,但对于大量项目(5000),它开始入队,然后抛出超时异常(在排队~3500项后).
我通过等待每一个完成然后继续下一个来解决它
private async Task EnqueueItemsAsync(IEnumerable<string> messages) {
foreach (var message in messages) {
await _queue.AddMessageAsync(new CloudQueueMessage(message), null, null, null, null);
}
}
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么会这样?
例外:
System.AggregateException包装许多此类异常:Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.<>c__DisplayClass4.<CreateCallbackVoid>b__3(IAsyncResult ar)请求信息RequestID:RequestDate:StatusMessage:<--- --->(内部异常#1)Microsoft.WindowsAzure.Storage.StorageException:客户端无法在指定的超时内完成操作.---> System.TimeoutException:客户端无法在指定的超时内完成操作.---内部异常堆栈跟踪结束--- Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndExecuteAsync [T](IAsyncResult result)`.
我可以从这个页面看到,当它们被用作触发器时,你可以简单地访问队列消息元数据属性,但我想做相反的事情.我有一个Azure函数,它将消息写入队列,但它当前具有默认的到期时间,我想设置一个更短的过期时间,因此它们只在队列中存在很短的时间.
有没有办法从Azure函数将消息写入队列以设置过期时间?
谢谢
编辑1: 一个警告是我提前不知道队列的名称.这是传入消息的一部分,因此将queuename设置为输出绑定的参数,我根据@Mikhail的建议进行了更改.这是现有的功能:
#r "Microsoft.WindowsAzure.Storage"
#r "Newtonsoft.Json"
using System;
using Microsoft.WindowsAzure.Storage.Queue;
using Newtonsoft.Json;
public static void Run(MyType myEventHubMessage, CloudQueue outputQueue, TraceWriter log)
{
var deviceId = myEventHubMessage.DeviceId;
var data = JsonConvert.SerializeObject(myEventHubMessage);
var msg = new CloudQueueMessage(data);
log.Info($"C# Event Hub trigger function processed a message: {deviceId}");
outputQueue.AddMessage(msg, TimeSpan.FromMinutes(3), null, null, null);
}
public class MyType
{
public string DeviceId { get; set; }
public double Field1{ get; set; }
public double Field2 { get; set; }
public …Run Code Online (Sandbox Code Playgroud)