问题标签 [azure-servicebus-subscriptions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
azure - 在多个进程中使用来自 Azure 服务总线的消息
我正在开发一个基于 Azure 服务总线的系统,用于通过 API 快速即发即忘,并通过主题通过后台服务异步处理大量消息。在这个问题的上下文中,该主题有一个订阅,为什么它可能是一个队列。出于其他原因,我想将其保留为一个主题。
我最近将代码从使用包的 .NET 框架应用程序迁移到使用WindowsAzure.ServiceBus
包的 .NET CoreMicrosoft.Azure.ServiceBus
包。为了处理大量消息,我使用这样的MessageReceiver
类:
为简单起见,我隐藏了一系列细节。就像我的应用程序启动 5 个线程并使用相同messageReceiver
实例在每个线程中处理消息的事实一样。
我通常会运行多个此应用程序的实例,以跨线程和进程分布。我相信我们终于找到了我的问题的代码。在迁移到 .NET Core 和新的 NuGet 包后,我注意到只有一个应用程序同时处理消息。当打开两个控制台窗口并在每个窗口中启动一个进程时,我可以看到窗口 1 中的应用程序开始处理。Windows 2 中的应用程序不处理任何内容。几秒钟后,窗口 1 中的应用程序停止处理,窗口 2 中的应用程序开始处理。过了一会儿,它又切换回来。开关中没有真正的模式,但我的所有消息都已成功处理。
是否存在某种限制MessageReceiver
,允许处理来自同一订阅或类似订阅的消息的最大线程数?
azure - 从没有正文的 Azure 服务总线主题接收异步
我正在创建一个 Azure 服务总线主题(订阅)的消费者,它只存储一些统计信息。发送到主题的消息包含一个相当大的主体,由另一个消费者在同一主题的第二个订阅中处理。
由于统计消费者可以一次性处理大量消息,我想知道是否可以接收大量消息但在与服务总线通信时省略主体以提高性能并一次性接收更多消息.
我目前正在这样做:
它工作得非常好,但如果能够接收 100 条或更多消息,而不必担心在网络上移动大消息,那就太好了。
在有人建议之前,我已经知道我可以要求对主题订阅进行计数等。我仍然需要该Message
对象,因为它包含UserProperties
字典中用于计算统计信息的条目。
android - 在 SubscriptionClient 上调用 RegisterMessageHandler 时出现超时异常
我正在尝试在 Android 中运行的 SubscriptionClient 实例上调用 RegisterMessageHandler 方法。
在向特定主题发布消息大约 20 秒后(通过自动化测试),我在我的 Android 应用程序中收到了几个超时异常,这些异常实际上包含了 SubscriptionClient 实例的 RegisterMessageHandler。
输出窗口
这是错误:
** System.TimeoutException: ** '超时'
登记
下面的代码实例化一个 SubsciptionClient,然后注册一个消息处理程序:
消息处理程序
消息处理程序代码永远不会执行。相反,我在输出窗口中观察到几个超时异常警报以及超时消息。
这是我在 RegisterMessageHandler 中注册的代码:
Android 测试 - 失败
以下测试会在大约 20 秒后在我的 Android 应用程序中发布一条导致超时异常的消息:
控制台测试 - 通过
我能够在控制台应用程序中成功运行相同的订阅代码(没有任何超时):
这是实现:
附录
我将以下内容应用于我的连接字符串:
我参考了以下链接:
https://github.com/Azure/azure-service-bus-dotnet/issues/529
azureservicebus - 使用会话完成服务总线主题订阅中的消息的逻辑应用不会释放锁定
我在 Azure 的服务总线上有一个主题订阅,锁定持续时间为 30 秒并启用了会话。
我正在使用逻辑应用程序使用峰值锁定获取主题的消息,因为我关心处理消息的顺序。我想确保所有具有相同会话 id 的消息都按照它们添加到总线的顺序进行处理,即 FIFO。
下面是一个简单逻辑应用程序的屏幕截图,它在消息到达时触发(带有 5 秒轮询的 peek-lock),然后等待 15 秒才能完成消息。
当我在主题上加载 10 条消息时,逻辑应用程序的第一个实例会按您的预期触发并在大约 15 秒内完成,但是第二个逻辑应用程序不会在另外 15 秒内启动,即总共 30 秒后第一个逻辑应用程序启动(锁定持续时间的长度)。
我读过的所有内容都表明完成一条消息应该立即释放锁,但情况似乎并非如此。我做错了什么还是这就是它的工作方式?
python-3.x - 如何使用 Python 从 Azure 服务总线主题中读取所有消息?
我想使用 python 从 azure 服务总线读取所有消息。目前它只获取一条消息。
如何使用 python 3 从主题中批量获取所有消息
python-3.x - 使用 python 从 azure SubscriptionClient 获取消息计数
我是 azure SubscriptionClient 的新手,我正在尝试使用 python 从 azure SubscriptionClient 获取总消息数。
azureservicebus - 涉及现有 Azure 服务总线主题和安全性时的 MassTransit 方法
我正在为事件的发布者和消费者实现一个库,以通过 Azure 服务总线进行通信,我认为 MassTransit 可能是一个不错的选择。
我可以使用它发布多个事件,并且如果我让 MassTransit 创建它需要的任何主题并通过在消费者上仅指定我指定队列名称的 3 种事件类型的接收器端点,我可以让多个消费者接收它们而没有任何问题.
示例消费者:
请注意,我将 an 指定为使用者,EventHandlerAdapterType<TEvent>
因为我有一个适配器可以从 MassTransit 中抽象出事件处理程序。但这与这个问题无关。
发布者配置如下:
问题是我需要使用与创建自己的主题的系统集成的这个库,并且它具有安全性(只有某些应用程序可以发布到它,只有某些应用程序可以读取已发布到该主题的消息)
所以我需要为想要发布某些主题的事件的发布者以及想要从某些主题中阅读的消费者创建一个令牌 sas。但是,令牌的创建超出了这个问题的范围。
我的解决方案尝试:我在 Azure 服务总线中准备了以下场景:-创建主题topic-attempt-one
(启用分区,但不确定是否相关)-在其中创建订阅subscription-attempt-one
-topic-attempt-one
在主题上创建仅发送权限的共享访问策略SamplePublishOnly
-创建共享SampleReadOnly
具有只听权限的主题的访问策略
我修改了我的示例,以便发布者按照 per 使用 key 和 keyName,SamplePublishOnly
并且两个消费者按照 per 使用 key 和 keyNameSampleReadOnly
在发布者上,我将其配置为对 3 个不同的事件使用相同的主题。
消费者我为这三条消息配置了一个接收端点(消费者一有一个队列名称,消费者二有一个不同的队列名称),并添加了准确指定主题和要使用的订阅。
消费者现在不能启动公共汽车。我认为存在权限问题:
好的,所以我决定在 Azure 服务总线中为每个消费者手动创建两个队列,希望 MassTransit 可以在需要不同消息时创建虚拟队列。- 创建queue-one
- 创建共享访问策略,声明仅收听,我调用它QueueReadOnly
并尝试使用它的 keyName 和密钥。
没有什么。一个不同的错误,但仍然无法使其工作
哪种是有道理的,因为我告诉它使用特定的主题和订阅,但不使用对它们具有读取权限的令牌,因为我已将其替换为队列之一。
问题
- 这是适合我的场景的正确方法吗?
- 可以尝试共享同一个主题来发布 3 种不同的消息类型吗?似乎 MassTransit 的设计让我每条消息使用一个主题。
- 如何实现我需要的?如果我不希望 MassTransit 发布者和消费者使用
Manage
完全权限令牌,因为我不希望消费者(例如)在某个主题上发布,那么其他人如何处理权限?
谢谢!
PS:我发现了一个类似的问题,但不幸的是它并没有解决我的问题。 如何指定要与 MassTransit 一起使用的 Azure 服务总线主题
更新 1
我发现了这一点:是否可以在没有管理权限策略的情况下将 MassTransit 3 与 Azure 服务总线一起使用?
如果最新的 6.2 版本仍然是这种情况,它可以解释为什么我会收到这些错误。如果我不能使用“管理”以外的任何声明,那就太可惜了。那么,Masstransit 没有细粒度的权限吗?如何防止具有Manage
令牌的应用程序读取不应该读取的消息?
如果无法创建主题、订阅或队列等实体,是否可以使用 Masstransit?
我猜我缺乏很多知识,所以任何链接也将不胜感激!
azureservicebus - 为什么 RegisterMessageHandler 不适用于特定主题名称?
我不明白为什么下面引用的以下处理程序(processMessageAsync)没有为特定主题名称触发,但其他主题名称成功:
以下是我的订阅者类:
这是我尝试运行订阅者的方式:
以下代码发布了我的订阅者应该收到的消息(但没有):
笔记:
上面代码的有趣之处在于,当我运行 Azure 函数时,ServiceBusTrigger 设置为相同的主题和订阅名称,每次运行测试时都会触发该 Azure 函数。
- 我没有收到任何异常消息
- 我的订阅者实例上永远不会触发exceptionReceivedHandler函数
- 我没有在我的 Azure 仪表板上观察到 servicebus 资源的任何用户错误
使用不同的主题名称成功
如果我将主题名称更改为“courier-requested”,则订阅者实例会收到消息:
这是具有主题名称调整的订阅:
在门户中单击主题有不同的结果:
我注意到我必须单击“已接受快递”两次才能查看它的订阅。但是,我可以单击“快递请求”一次并立即查看其订阅。
c# - Azure 服务总线消息在订阅中的运行时反序列化为未知类型
令人惊讶的是,但我还没有找到一个示例,其中订阅时收到的消息可能是不同类型的,并且需要知道类型才能使用正确的类型反序列化其内容。这是相关的,但它没有考虑这种情况
我有一个发布订阅者场景。对于订阅者,根据https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-how-toMessage
创建可以使用 Azure 服务总线库发布的-use-topics-subscriptions
我需要传递一个字节数组。它似乎没有任何类似自定义元数据的东西,我可以用它来指定消息或类似的程序集类型。
当订阅收到消息时,它必须反序列化它,但我不知道具体消息是哪种类型才能做JsonConvert.DeserializeObject<TDestType>(Encoding.UTF8.GetString(message.Body))
有没有人有任何链接或样本来实现这一目标?还是推荐的做法是仅将主题和主题订阅与一种类型的消息一起使用?(我对此表示怀疑,但我知道 MassTransit 例如在幕后为每条消息创建一个主题..)
更新 1:现在我将使用 Message 中的 ContentType 属性来存储 EventType,以便订阅者可以使用它来反序列化。但是如果感觉“hacky”,因为该字段应该存储格式类型(json、xml 等)