如果 BrokeredMessage 的正文是 JSON 文本,是否可以使用该 JSON 中的属性过滤器设置主题订阅?
我有一个队列,其中放置了大量高频数据。我有一个 azure 函数,该函数将在向其中写入新消息并将消息写入 Azure sql 数据库时触发。我的问题是有太多的消息要写,所以我想做的是“积累”消息,然后一次将它们全部写入数据库。我在 Azure 函数服务总线集成中没有看到任何类型的功能来获取所有(或 x)消息并处理它们。
这样的事情可能吗?
任何帮助表示赞赏。
我有一个 v.2 服务总线触发器函数,当我尝试启动时,它抛出以下异常:
System.InvalidOperationException
HResult=0x80131509
Message=The host has not yet started.
Source=Microsoft.Azure.WebJobs.Host
StackTrace:
at Microsoft.Azure.WebJobs.JobHost.StopAsync() in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\JobHost.cs:line 121
at Microsoft.Azure.WebJobs.Hosting.JobHostService.StopAsync(CancellationToken cancellationToken) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Hosting\JobHostService.cs:line 32
at Microsoft.Extensions.Hosting.Internal.Host.<StopAsync>d__10.MoveNext()
Run Code Online (Sandbox Code Playgroud)
我四处搜索,但找不到任何有类似问题(并修复)的人。我正在运行 VS 15.8.7,并更新了所有扩展和包。
这是我的函数的样子:
[FunctionName("ServiceBusListenerFunction")]
public static void Run([ServiceBusTrigger("myTopic", "MySubscription", Connection = "MyConnection")]string mySbMsg, ILogger log)
{
log.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
}
Run Code Online (Sandbox Code Playgroud)
这是我的 local.settings.json:
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"MyConnection": "UseDevelopmentStorage=true",
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"AzureWebJobsDashboard": "UseDevelopmentStorage=true"
},
"Host": {
"LocalHttpPort": 7077
}
}
Run Code Online (Sandbox Code Playgroud)
我还尝试在 launchSettings.json 中执行以下操作,但没有帮助:
{
"profiles": { …
Run Code Online (Sandbox Code Playgroud) azure azureservicebus azure-servicebus-queues azure-functions
我是 Azure 服务总线的新手,我发现我需要不断轮询队列消息才能接收它们。但是,我希望 Queue 将消息推送到客户端的某种侦听器,而不必轮询消息。
我已经读到轮询在 Azure 服务总线中是可选的,但我找不到没有它如何接收消息。
如果可以的话请帮忙。谢谢
已部署的云服务应用如何调试?
我正在尝试使用主题和订阅在我的应用程序中呈现 RDLC 报告。每当我在本地运行云应用程序时,我都不会收到任何错误。但是,一旦我将其部署在云上,我就会收到一个错误,该错误未在一定程度上进行描述,因此无法纠正。
我发现错误是在准备好呈现报告时出现的,而不是在其他地方出现。我正在寻找一种可能的机制(像我们在本地那样插入断点等),使用它可以调试已部署的云应用程序。
由于我使用的是 VS2012 Express 和 professional,intellitrace 在这里不起作用。
rdlc azure intellitrace visual-studio-debugging azureservicebus
为什么我的 Azure 服务总线队列在未启用时将消息发送到死信子队列?
从一开始我就确保过期的消息不会被移动到死信队列(或者我是这么认为的)。
在 Visual Studio Server Explorer 中,我在队列下看到以下内容:
但我也看到了这一点:
我无法像平常一样将它们拉出来,所以我创建了一个临时服务来处理(摆脱)这些,这就是我能够从以下内容中提取的内容brokeredMessage.Properties
:
我希望消息在未完成时保留在正常队列中。到目前为止,我已将 MaxDeliveryCount 更改为 1000,但这不是真正的解决方案。
我在忽略什么?
更新 在阅读我自己的文本后,我意识到 EnableDeadLetteringOnMessageExpiration 与传递计数无关。我是否可以选择让我的消息永远保留在正常队列中?或者我是否必须将 MaxDeliveryCount 设置为“足够高”?
我正在建立一个系统,我们将在 ServiceBus 主题上的多个内部服务之间传输消息。消息将保存序列化的对象。模型对象被定义为相当复杂的类树。这意味着在代码中维护模型结构的双重版本是不切实际的。
我们预计模型结构会发生变化,因此我将模型版本作为代理消息的属性公开。
当我们需要升级模型版本时,处理过渡的最佳方法是什么?
我不认为我们真的需要支持两个并行模型版本。但我担心我们在过渡期间不会丢失信息。我认为首先升级发送服务并让所有订阅者继续处理消息是一个很好的策略。当之前版本的所有消息都处理完毕后,就到了订阅服务升级的时候了。
跳过侦听服务当前未处理的新版本消息的最佳机制是什么?
我知道我可以回到老方法,通过使用 json 或 xml 模式来定义并行模型版本,从而使监听服务能够处理并行版本。但这会很麻烦,所以我真的想避免这种情况。
我注意到 BrokeredMessage 有一个 Defer 方法。那会有用吗?它看起来很有希望,直到我意识到消息将从实时队列“移动”到一个单独的状态,需要通过按键引用它们来拉取它们。不实用。
是否可以通过修改发送时间来推迟消息?几分钟就可以了。如果到那时相同的服务仍在运行,则可以再次推迟。(如果有工作代码示例,我们将不胜感激!)
我需要根据型号版本创建单独的订阅吗?到目前为止,我们允许不同的消息类型在同一主题上传播,因此需要进行一些重新设计。
许多设备正在发送消息,这些消息最终进入单个 Azure 服务总线队列(或主题)。我们希望并行处理多个消息,但我们希望避免在任何给定时间并发处理同一设备的两个消息。
下图说明了目标。有 3 个处理线程(实际上可能有几十个,分布在多个服务器之间)。每个方框表示单个消息的处理时间,颜色表示它属于哪个设备。
您可以看到,在任何时间点都没有来自同一设备的两个或多个重叠消息。
由于涉及多个处理服务器,我可以想象防止并发处理的唯一方法是以设备 ID 作为分区键对消息进行分区,然后每个分区只有一个消费者:
因此,来自“黄色设备”的所有消息都会发送至分区 1,依此类推。
我仍然想在单个进程中运行多个处理线程。现在,我们做一些简单的事情,比如
var client = QueueClient.CreateFromConnectionString(connectionString, queueName);
var options = new OnMessageOptions { MaxConcurrentCalls = x };
client.OnMessage(m =>
{
// Process...
m.Complete();
});
Run Code Online (Sandbox Code Playgroud)
如何将并发限制合并到此类代码中?
我可以想象一些基于参与者或其他并发机制的客户端解决方案。但有没有办法在 Broker 层面解决这个问题呢?
本页介绍如何使用 Azure 服务总线中的会话将来自同一源的消息分组到相同的接收器中。
在无会话队列处理器中,我可以控制可以并行获取的消息数量:
new OnMessageOptions { MaxConcurrentCalls = 10 };
Run Code Online (Sandbox Code Playgroud)
如果我传递这些选项,则同时处理的消息不会超过 10 条。
现在,对于会话式处理器,选项被替换为
new SessionHandlerOptions { MaxConcurrentSessions = 10 };
Run Code Online (Sandbox Code Playgroud)
其含义不同,即同时进行的会话不超过 10 个。
我的会话寿命相对较长,而且大部分都是空闲的,因此我必须将此参数设置为较高的值。但是,我仍然想限制并行消息的数量。
这可以开箱即用吗?
MaxConcurrentSessions
如果我设置为,并行化的实际限制是什么int.MaxValue
?
我们在西欧地区使用 Azure 服务总线。
当我查看指标以调查重复问题时,我注意到我们存在大量“服务器错误”。这似乎占了请求的近 50%。
现在,微软关于服务器错误含义的信息并不多,除了说它是“内部服务总线错误”(参见https://learn.microsoft.com/en-us/azure/service-bus-messaging /service-bus-metrics-azure-monitor)
我的问题: 我需要担心吗?目前我在西欧仍然可以依赖 Service Bus(上个月该地区的 Service Bus 出现了一些问题)。
这是什么意思?我该如何解决?
提前谢谢
azure azureservicebus azure-servicebus-queues azure-servicebus-topics
azureservicebus ×10
azure ×7
c# ×2
concurrency ×1
dead-letter ×1
intellitrace ×1
rdlc ×1
servicebus ×1
version ×1