这是一个理论问题:
当我使用消息队列构建应用程序时,我将需要多个队列支持不同的数据类型以用于不同的目的。假设我有 20 个队列(例如,一个用于创建新用户,一个用于处理新订单,一个用于编辑用户设置等)。
我将使用“最少”1 个 Web 角色和 1 个辅助角色将其部署到 Windows Azure。
如何以正确的方式从所有这 20 个队列中读取数据?这就是我的想法,但我对此几乎没有或没有现实世界的实践经验:
创建一个在辅助角色“main”类中产生 20 个线程的类。让这些线程中的每一个都执行一个方法来轮询不同的队列,并让所有这些线程在每次轮询之间休眠(当然还有增加休眠时间的回退机制)。
这导致有 20 个线程(或 21 个?)和 20 个正在主动轮询的队列,从而导致大量消息浪费(每次轮询空队列时,它都被计为消息)。
你怎么解决这个问题?
message-queue azure azure-storage-queues azure-servicebus-queues
以高效的方式写入Azure Queue Storage的正确调用/代码模式是什么?
现在,伪代码是
使用StorageCredentials和CloudStorage帐户属性创建静态类.在应用程序启动时,将配置文件中的值读入{get;} - 仅属性.
使用具有我的应用程序消息类型的输入参数的异步Task方法创建类.该方法序列化类型,创建新的CloudQueueMessage,新的CloudQueueClient,新的CloudQueue引用.在需要配置信息的地方,从静态类中读取.我的代码然后:
await Task.Run( ()=> theref.AddMessage(themessage).
Run Code Online (Sandbox Code Playgroud)
它看起来好像我在代码中有一些冗余,并且不确定是否/如何将连接汇集到队列中,以及我是否需要重试逻辑,就像我对数据库(SQL Server等)连接一样.
我试图了解哪些队列访问步骤可以以任何方式减少或优化.
所有想法都赞赏.
使用.NET 4.5.2,C#.代码正在Cloud Service(工作者角色)中执行.
谢谢.
我需要在两台服务器之间发送xml文件.这些文件最多可达1mb.
我正在考虑使用Azure存储队列作为这些文件的中间目标,但请注意,邮件大小有64kb的限制.我认为发送超过64kb的消息的要求并不少见.
有没有办法绕过极限?压缩也许?
所以我将一个项目从我的ASP.NET Web API发送到Azure存储队列,我想向用户提供关于他们的项目在队列中的位置的一些反馈,以及能够更新他们的位置项目,如果他们回来或类似的东西.
并不是说它与这里的问题有很大关系,但这是我用来将项目放在队列中的方法
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigHelper.GetAzureStorage());
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
CloudQueue queue = queueClient.GetQueueReference("my-queue");
await queue.CreateIfNotExistsAsync();
var messageJson = JsonConvert.SerializeObject(item);
CloudQueueMessage cloudQueueMessage = new CloudQueueMessage(messageJson);
await queue.AddMessageAsync(cloudQueueMessage);
Run Code Online (Sandbox Code Playgroud)
所以我一直在探索CloudQueueClient,CloudQueue但我能找到的CloudQueue.ApproximateMessageCount总是返回null.
我还尝试了一些谷歌搜索如何总是出现入门指南,特别注意我如何获得项目的大小然后在队列中的位置,所以它甚至可能吗?
我对有关Azure队列,函数和工作器的功能有一些疑问。我不确定这是如何工作的。
场景:
理论上,当将消息添加到q通知时,应调用f-process-notification函数。
问题:
触发功能是否取代了需要工人的需求?换句话说,每当一条消息放入队列时,都会调用f-process-notification。
假设我在可见性超时为5分钟的队列中放置了一条消息。基本上,我正在对消息进行排队,但是直到5分钟后才应采取行动。队列是在将消息放入队列时立即触发f-process-notification还是仅在消息变为可见时(即,将消息放入队列后5分钟)才触发f-process-notification?
如果我创建一个由存储队列消息触发的Azure功能...系统是否会启动多个并行功能以从队列中获取每条消息,或者是否会调用一个函数来读取所有可用消息?
简而言之,排队的邮件是单独处理还是分批处理?
我正在努力解决编码问题。我仍在尝试找出Python3的编码方案。我正在尝试将 json 对象从 Python 上传到 Azure 队列中。我正在使用Python3
我制作了 json 对象
response = {"UserImageId": 636667744866847370, "OutputImageName": "car-1807177_with_blue-2467336_size_1020_u38fa38.png"}
queue_service.put_message(response_queue, json.dumps(response))
Run Code Online (Sandbox Code Playgroud)
当它到达队列时,我收到错误
{"imgResponse":"The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters. ","log":null,"$return":""}
Run Code Online (Sandbox Code Playgroud)
所以我必须做其他事情,因为显然我需要对我的字符串进行 Base64 编码。所以我尝试
queue_service.put_message(response_queue, base64.b64encode(json.dumps(response).encode('utf-8')))
Run Code Online (Sandbox Code Playgroud)
我得到
TypeError: message should be of type str
Run Code Online (Sandbox Code Playgroud)
来自 Azure 存储队列包。如果我检查上述语句的类型,它是字节类型(有意义)。所以我的问题是,如何将 json 对象编码为队列服务能够理解的内容。我真的希望能够保留 _ 和 - 和 。图像名称中的字符。
我有一个 .NET Core 2.2 控制台应用程序可以连接到 Azure 存储队列。它在我的电脑上工作,但我无法让它在公司代理后面工作。我需要做什么?(我对存储帐户名称和密钥以及代理主机名进行了匿名处理。)
.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>8.0</LangVersion>
<NullableContextOptions>enable</NullableContextOptions>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Management.Fluent" Version="1.21.0" />
<PackageReference Include="Microsoft.Azure.Storage.Queue" Version="10.0.1" />
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
包装类:
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Queue;
using System.Threading.Tasks;
namespace Queue
{
public class Queue
{
public Queue(string connectionString, string queueName)
{
var storageAccount = CloudStorageAccount.Parse(connectionString);
var cloudQueueClient = storageAccount.CreateCloudQueueClient();
CloudQueue = cloudQueueClient.GetQueueReference(queueName);
}
private CloudQueue CloudQueue { get; }
public async Task<string> PeekAsync()
{
var m = await CloudQueue.PeekMessageAsync();
return m.AsString;
}
}
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取 Azure Web 作业队列中当前处理消息的消息 ID。找不到任何有关如何获取它的正确文档。
public static void ProcessQueueMessage([QueueTrigger("%testingQueue%")] TestingMessageModel testMessage, TextWriter log)
{
// want to do some logging for this particular triggered message using the messageid. How to get that?
}
Run Code Online (Sandbox Code Playgroud)
添加TestingMessageModel作为参考,它没有任何指导。我想使用 azure 在将消息放入队列时创建的 GUID。
public class TestingMessageModel
{
public int FromOrg {get; set;}
public DateTime BatchDate {get; set;}
public Payments[] payments {get; set;}
}
Run Code Online (Sandbox Code Playgroud) Azure 队列存储和 Azure 服务在死信队列和有害消息方面有什么区别?
我如何从这些队列中读取消息?
azure ×8
c# ×5
.net ×1
.net-core ×1
azure-queues ×1
base64 ×1
http-proxy ×1
python ×1
python-3.x ×1
queuetrigger ×1
retrypolicy ×1
visibility ×1