如何获取 Azure 服务总线队列中的死信消息计数?
我可以像这样得到队列中的计数......
var ns = NamespaceManager.CreateFromConnectionString(sbConnectionString);
var queue = ns.GetQueue(queueName);
var count = queue.MessageCount;
Run Code Online (Sandbox Code Playgroud)
但这看起来既包括队列中的消息,也包括关联的死信队列中的消息
我如何区分它们?
我无法连接到 Microsoft Azure 通知中心来管理订阅(获取注册和发送通知)。我有一个简单的 C# 控制台工具并执行NotificationHubClient 方法,出现异常:(401) 不允许..TrackingId:****uid_here*****
使用 Fiddler,我收到以下原始错误消息: HTTP/1.1 401 40103:无效的授权令牌签名
我正在使用带有正确连接字符串(完全共享访问)的程序集 Microsoft.Azure.NotificationHubs v2.16.0.0 和 WindowsAzure.ServiceBus v4.0.0。我从 azure 管理门户复制了确切的连接字符串,并且还尝试连接 ServiceBusExplorer,但这是不可能的,并且使用此工具时出现错误:
Receivera:InternalServiceFault由于内部错误,服务器无法处理请求。有关错误的详细信息,请在服务器上打开 IncludeExceptionDetailInFaults(从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为),以便将异常信息发送回客户端,或者根据 Microsoft .NET Framework 打开跟踪SDK 文档并检查服务器跟踪日志。
有人有这样的烦恼吗?
谢了!
更新:谢谢你们。这是一个连接字符串问题。错误在于 SharedAccessKeyName。当前的默认名称是 DefaultFullSharedAccessSignature,我的初始密钥 RootManageSharedAccessKey 不再起作用。我认为天蓝色可以改变它。它不接受与根密钥的连接...或者它被其他人出于其他原因更改。
我有一个 Azure 函数(基于新的 C# 函数而不是旧的 .csx 函数),每当消息进入 Azure 服务总线队列时就会触发该函数。一旦该函数被触发,它就开始处理服务总线消息。它对消息进行解码、读取大量数据库、更新大量其他数据库等等……这有时可能需要 30 分钟以上。
由于这不是一个时间敏感的过程,30 分钟甚至 60 分钟都不是问题。问题是,与此同时,Azure Function 似乎再次启动并一次又一次地获取相同的消息并重新处理它。这是一个问题,会导致我们的业务逻辑出现问题。
那么,问题来了,我们能否强制Azure函数以单例模式运行呢?或者如果这是不可能的,我们如何更改轮询间隔?
我找到了有关 AMQP 所使用端口的文档:
Azure 服务总线始终要求使用 TLS。它支持通过 TCP 端口 5671 的连接,在进入 AMQP 协议握手之前,TCP 连接首先用 TLS 覆盖,并且还支持通过 TCP 端口 5672 的连接,服务器立即使用 AMQP 规定的模型强制升级到 TLS 的连接。AMQP WebSockets 绑定通过 TCP 端口 443 创建一条隧道,该隧道相当于 AMQP 5671 连接。
其他帖子中有更多详细信息:
它支持通过 TCP 端口 5671 和 TCP 端口 5672 的连接。服务器立即使用 AMQP 规定的模型提供对 TLS 的强制升级。AMQP WebSockets 绑定通过 TCP 端口 443 创建一条隧道,该隧道相当于 AMQP 5671 连接。
我不太明白这两个端口有什么区别。两者都应该始终打开,还是只是所需的其中之一,另一个是一些后备,或者取决于所使用的库。
PS我使用Microsoft.Azure.ServiceBus库来连接
我通过 HTTP POST 将消息发送到我的 Azure 事件中心(与 IoT 中心和 Blob 存储一起使用)。
我试过了:
找到这个问题后我添加了标题。我还确保检查了权限,正如那里所建议的那样,但它们已经设置为必要的级别。
值得注意的是:由于某种原因,它确实可以在原始设置下工作一次(在第一张图片上以黄色标记)。

我的问题:
1. 我是否需要手动添加同名的服务总线端点?我假设当您创建事件中心时,它会自动为您创建服务总线。
2. 难道我看到的请求实际上与我发送的消息无关?
3.我这个配置错了吗?
从文档中不清楚如何输出结构化消息。在我使用过的旧函数中BrokeredMessage,文档说要Message用于 V2 函数,但是没有关于如何使用它的指导。这样对吗:
[FunctionName(nameof(Job))]
public static async Task<IActionResult> Job(
// ...
IAsyncCollector<Microsoft.Azure.ServiceBus.Message> serializedJobCollector
)
Run Code Online (Sandbox Code Playgroud)
目标是能够设置一些元数据属性,如 ID,我之前(使用 V1 和BrokeredMessage)做过重复检测,但我不确定这是否正确,或者我需要序列化为字符串或什么...
对于我们的持续部署,我们希望为主题中的死信消息设置警报规则。在 Azure 门户上,此指标作为预览功能存在。我们希望通过 ARM 模板创建此警报规则。
我的 ARM 模板参数中是否已有可用于此目的的指标名称?如果没有,什么时候可以在我们的 ARM 模板中使用这个指标?
请参阅此处未列出指标名称: https: //learn.microsoft.com/en-us/azure/azure-monitor/platform/metrics-supported#microsoftservicebusnamespaces
AzureServiceBus 和 NServiceBus 对我来说都是新的,我正在探索将 NServiceBus 用于微服务架构。
我知道 NServiceBus 可以使用不同的传输方式,如 Learning、SQLServer、MSMQ、AzureServiceBus 等。我还使用上述传输方式创建了 POC。
我想了解的是,当 AzureServiceBus 可以用作企业服务总线时,将 NServiceBus 与它一起使用有什么好处?
换句话说,为什么我要使用 AzureServiceBus 作为 NServiceBus 中的传输?不只使用 AzureServiceBus 有什么好的理由吗?
我正在尝试用 .NET Standard Microsoft.Azure.ServiceBus 替换 .NET Framework NuGet 包 WindowsAzure.ServiceBus,但我遇到了这个问题。如何为服务总线主题订阅创建 MessageReceiver 的实例?我可以使用以下代码为队列创建它:
var receiver = new MessageReceiver(connectionString, queueName);
var bytes = receiver.ReceiveAsync().Result.Body;
string s = Encoding.UTF8.GetString(bytes);
Console.WriteLine(s);
Run Code Online (Sandbox Code Playgroud)
但 MessageReceiver 没有用于从服务总线主题订阅获取数据的构造函数。
我尝试按照本教程对我的服务总线进行身份验证DefaultAzureCredentials,但是,我收到了 401。
我在设置中使用以下代码:
services.AddAzureClients(x =>
{
x.AddServiceBusClientWithNamespace("myns.servicebus.windows.net")
.WithCredential(new Azure.Identity.DefaultAzureCredential());
});
Run Code Online (Sandbox Code Playgroud)
然后我像这样调用 SB 客户端:
var sender = client.CreateSender("myqueue");
var message = new ServiceBusMessage(Encoding.UTF8.GetBytes("test"));
await sender.SendMessageAsync(message);
Run Code Online (Sandbox Code Playgroud)
当我打电话时,SendMessageAsync我收到 401 错误:
失败:Azure-Messaging-ServiceBus[82] 为标识符创建发送链接时发生异常:myqueue-578624f3-f732-4a9b-2ab0-9adc01949a5a。错误消息:'System.UnauthorizedAccessException:放置令牌失败。状态代码:401,状态描述:InvalidIssuer:令牌发行者无效。TrackingId:cde3a89c-8108-48d1-8b8f-dacde18e176f, SystemTracker:NoSystemTracker, Timestamp:2021-05-19T07:18:44。
在我运行它之前,我调用az login. 我可以访问命名空间来发送和接收。我的猜测是我需要在服务总线和......之间分配某种权限 - 但由于我将它作为控制台应用程序运行,我使用自己的凭据运行。显然,我不明白有关托管身份的某些内容。
编辑:
根据@juunas 的建议,我尝试了以下操作:
services.AddHostedService<ConsoleHostedService>();
services.AddAzureClients(x =>
{
//var creds = new Azure.Identity.EnvironmentCredential(); // 1st - EnvironmentCredential authentication unavailable. Environment variables are not fully configured.'
//var creds = new Azure.Identity.ManagedIdentityCredential(); // 2nd - No Managed Identity endpoint …Run Code Online (Sandbox Code Playgroud) azureservicebus ×10
azure ×7
c# ×4
.net ×1
amqp ×1
architecture ×1
azure-devops ×1
firewall ×1
nservicebus ×1
port ×1
singleton ×1