已部署的云服务应用如何调试?
我正在尝试使用主题和订阅在我的应用程序中呈现 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 上有关使用共享访问签名的大量文档,并且我不认为可以将 Webhook 直接传递到 Evenhtubs。我认为像 Azure Function 或 Logic App 这样的中间服务目前需要充当中间人。
生成 Webhook 的服务必须选择实现 Azure 共享访问签名用于 Eventhub 的签名方案才能接收此类 Webhook 的说法是否正确?
此外,是否有任何 Azure PAAS 服务(例如文档 DB 或 Azure SQL)具有 API 身份验证方案,可以通过相当简单的 Webhook 直接写入?
我这里有默认的基于 C# 的 HTTP 触发器,我希望将数据“Hello Name”发送到服务总线主题(已创建)。我在门户网站上编码。
如何做到服务总线输出绑定?
这是行不通的。任何可用的帮助?
- 缺少处理服务总线的参考?
- 如何定义服务总线的连接?Functions.json 在哪里
- 如何向服务总线发送消息?
//This FunctionApp get triggered by HTTP and send message to Azure Service Bus
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace Company.Function
{
public static class HttpTriggerCSharp1
{
[FunctionName("HttpTriggerCSharp1")]
[return: ServiceBus("myqueue", Connection = "ServiceBusConnection")] // I added this for SB Output. Where to define.
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = …Run Code Online (Sandbox Code Playgroud) 假设我们有以下场景:
如果我尽可能快地将这 10k 条消息排队,则外部系统将无法处理并发负载。我不知道Azure 同时运行多少个函数实例或应用服务实例(“横向扩展”)来处理这些消息。
这是我的函数定义的代码示例:
public class MyQueueProcessor
{
private IMyDependency MyDependency { get; }
public MyQueueProcessor(IMyDependency myDependency)
{
MyDependency = myDependency;
}
[FunctionName(nameof(MyQueueProcessor))]
public async Task Run([ServiceBusTrigger("my-queue-name", Connection = "MyQueueConnection")] string item, ILogger log)
{
var req = JsonConvert.DeserializeObject<MyQueueRequest>(item);
log.LogInformation($"Beginning processing of " + req);
// Valudate req
// Call external service REST API
await MyDependency.CallService(req, new { otherParameters = …Run Code Online (Sandbox Code Playgroud) 我从 Microsoft文档中了解到,在第一次 Peek() 操作期间,任何一个可用的消息代理都会响应并发送其最旧的消息。然后在随后的 Peek() 操作中,我们可以遍历分区以查看每条具有增加序列号的消息。
我的问题是,在第一次 Peek() 操作期间,我将从任何第一个响应的分区中收到一条消息。是否可以保证我可以查看队列中的所有消息?
以更简单的方式,有三个分区:分区“A”有 10 条消息,序列号从 1 到 10。分区“B”有 10 条消息,序列号从 11 到 20。分区“C”有 10 条消息,序列号从 21 到 30 的数字。
现在,如果我执行 Peek() 操作,如果分区“B”首先响应,我将得到的第一条消息是序列号为 11 的消息。下一个 peek 操作将查找序列号递增的消息。我不会错过来自分区“A”的消息,它的序列号为 1-10,因为它总是搜索递增的序列号,所以窥视操作永远无法到达?
更新
QueueClient queueClient = messagingFactory.CreateQueueClient("QueueName", ReceiveMode.PeekLock);
BrokeredMessage message = null;
while (iteration < deadLetterMessageCount)
{
message = queueClient.Peek(); // According to docs, Peeks the oldest message from any responding broker, and next iterations peek the message with incremented sequence number
if (message == null) …Run Code Online (Sandbox Code Playgroud) 试图确定窥视锁在服务总线中的工作方式时,我有点困惑。特别是我将 Microsoft.Azure.ServiceBus 与 Azure Functions 和 ServiceBusTrigger 一起使用。
从我可以看出消息被锁定的时间是在队列本身上设置的,默认为 30 秒,尽管它可以设置为最多 5 分钟的任何时间。
当从队列中偷看一条消息时,这个锁就会启动。
然后有一个名为 maxAutoRenewDuration 的设置,当使用 Azure Functions 时,该设置在 Extensions:ServiceBus:messageHandlerOptions 下的 host.json 文件中设置。这允许客户端自动请求一个或多个对锁的扩展,直到达到 maxAutoRenewDuration。一旦达到此限制,将不会请求续订,并且锁定将被释放。
续订是尽最大努力并且不能保证,因此理想情况下,您尝试提出一种设计,其中消息通常在队列上指定的锁定期内处理。
到目前为止我做对了吗?
我还有的问题是
maxAutoRenewDuration 可在 host.json 中配置,它映射到 OnMessageOptions.MaxAutoRenewDuration。根据服务总线文档,此设置允许的最大值为 5 分钟
哪个是正确的?我知道默认锁定持续时间最长为 5 分钟,但这似乎也适用于 maxAutoRenewDuration 似乎没有意义?
我在一些文章(例如链接)中读到了一个叫做 MaxLockDuration 的设置。这只是指队列本身设置的锁定持续时间吗?
我还缺什么吗?队列中设置的锁定持续时间和代码中的 maxAutoRenewDuration 是我在处理锁定和续订时需要考虑的主要事项吗?
谢谢
艾伦
azure azureservicebus azure-servicebus-queues azure-functions
azureservicebus ×10
azure ×7
c# ×4
.net ×1
concurrency ×1
dead-letter ×1
intellitrace ×1
rdlc ×1
servicebus ×1
version ×1
webhooks ×1