使用 azure 函数版本 1,可以接受 BrokeredMessage 消息。
public static void Run([ServiceBusTrigger("MySServiceBus", "MySubscriptionName", AccessRights.Listen, Connection = "MyConnectionString")]BrokeredMessage message, TraceWriter log)
Run Code Online (Sandbox Code Playgroud)
然后使用类似于以下的代码检索属性:
var MyProperty = message.Properties["MyMessageProperty"] as string
Run Code Online (Sandbox Code Playgroud)
使用 2.0 版本的函数 SDK,我无法将传入对象转换为 BrokeredMessage,而不会收到反序列化错误消息
反序列化 Microsoft.ServiceBus.Messaging.BrokeredMessage 类型的对象时出错。输入源的格式不正确。System.Private.DataContractSerialization:输入源的格式不正确。
是否可以使用函数2.0获取消息属性
根据此文档,服务总线支持两种模式:接收并删除和窥视锁定。
如果使用 Peek-Lock 模式,如果消费者在处理消息后立即崩溃/挂起/执行很长的 GC,但在 messageId 为“已完成”并且可见性时间到期之前,有可能会两次传递同一条消息。
那么微软是怎么说Service Bus支持最多一次交付模式的呢?是因为接收并删除模式只发送一次消息吗?但是话又说回来,如果消费者在处理消息时发生了某些事情,那么有价值的信息就会丢失。
如果是,那么使用 Azure 服务总线作为队列和 Azure 函数作为消费者来确保精确一次交付的最佳方法是什么。
PS 我能想到的一种方法是将 MessageID 存储在 blob 中,但在我的情况下,MessageID 的数量可能非常大,存储和加载所有消息并不是正确的方法。
我是 Azure 服务总线的新手,我正在研究它是否可以取代我们的 RabbitMQ 基础设施。
不管怎样,我想知道使用队列是否有意义?如果主题和订阅提供相同的功能+提供独立于多个源进行消费的灵活性。
例如,如果现在我的设置只有一个消费者组(可能是多个消费者,但都共享相同的消息队列),那么我可以使用具有单个订阅的主题。
队列有什么意义?它是否对主题和订阅提供某种优化?
在 .NET Framework 中,Microsoft.ServiceBus.Messaging 有一个用于从服务总线接收消息的类 BrokeredMessage。但是,在 .NET Standard 2.0 中,为了从服务总线接收消息,使用来自 Microsoft.Azure.ServiceBus.Core 的 Message 类。
BrokeredMessage有一个方法CompleteAsync(),用于完成消息的接收操作,并指示该消息应被标记为已处理和已删除。我找不到 Message 类执行相同操作的方法。你们知道有什么解决方案可以将 Message 类的消息标记为已处理和已删除吗?
我是 Azure 服务总线和 MassTransit 的新手,我正在尝试向队列发送一个简单的命令,然后让使用者使用该命令。我可以成功发送消息,然后由我的消费者使用,但是我注意到还创建了相应的主题。我对此有些天真的理解是,主题只需要用于事件发布和订阅。
这就是设置我的 IBus 实例的内容,其中 IMessageBus 封装了 MassTransit.IBus 实例
public static IMessageBus CreateBusAndRegisterQueueConsumer<T>(string servicePath, string queueName, IComponentContext autoFacContext)
where T : class
{
return new MessageBus
{
Instance = Bus.Factory.CreateUsingAzureServiceBus(
sbc =>
{
var host = ConfigureServiceBus(servicePath, sbc);
sbc.ReceiveEndpoint(host, queueName, ec =>
{
ec.Consumer<CommandConsumer<T>>(autoFacContext);
});
})
};
}
Run Code Online (Sandbox Code Playgroud)
我观察到的行为是否正确,因为发送命令总是会在幕后创建主题,或者我是否错误地设置了我的服务总线?如果确实需要创建主题,这是由于 MassTransit 的工作方式所致,还是 Azure 服务总线的某些基本要求?
我已查看有关使用 Azure 服务总线进行调度的文档,但我不清楚如何从“断开连接”的总线发送消息。
以下是我配置在服务器上处理消息的服务的方式:
builder.AddMassTransit(mt =>
{
mt.AddConsumers(cqrsAssembly);
mt.AddBus(context => Bus.Factory.CreateUsingAzureServiceBus(x =>
{
x.RequiresSession = true;
x.MaxConcurrentCalls = 500;
x.MessageWaitTimeout = TimeSpan.FromMinutes(5);
x.UseRenewLock(TimeSpan.FromMinutes(4));
x.UseServiceBusMessageScheduler();
var host = x.Host(serviceUri, h =>
{
h.SharedAccessSignature(s =>
{
s.KeyName = "key-name";
s.SharedAccessKey = "access-key";
s.TokenTimeToLive = TimeSpan.FromDays(1);
s.TokenScope = TokenScope.Namespace;
});
h.OperationTimeout = TimeSpan.FromMinutes(2);
});
x.ReceiveEndpoint(host, $"mt.myqueue", ep =>
{
ep.RequiresSession = true;
ep.MaxConcurrentCalls = 500;
ep.RemoveSubscriptions = true;
ep.UseMessageRetry(r =>
{
r.Interval(4, TimeSpan.FromSeconds(30));
r.Handle<TransientCommandException>();
});
ep.ConfigureConsumers(context);
});
});
});
Run Code Online (Sandbox Code Playgroud)
我已经明确地调用了UseServiceBusMessageScheduler() …
我正处于设计高级结构的早期阶段,我们的两个企业应用程序将如何广播到 Azure 服务总线中的主题。我是这项技术的新手用户,在初步阅读文档后,我很想使用一个简单的解决方案:为我们想要广播的每种不同的事件类型使用单独的主题。
我喜欢这个解决方案(而不是使用过滤器),因为它提供了对共享访问密钥的最精细的控制、最少的消息吞吐量,并且还允许在每个主题的基础上轻松添加和删除订阅。
另一种解决方案是使用较少的主题(将多个事件发送到单个主题),然后配置过滤器来确定每条消息是否应发送到订阅。从维护的角度来看,这似乎不必要地更复杂并且更不方便。当我可以创建数千个主题时,为什么还要费心使用过滤器呢?
任何人都可以提供有关最佳方法的反馈吗?
azureservicebus azure-servicebus-topics azure-servicebus-subscriptions
我正在尝试使用 C# azure 函数从队列中读取消息(通知而不是轮询)。
我目前正在使用控制台应用程序将消息推送到队列中,请参见下文。
似乎有两种不同的产品:天蓝色服务总线和存储帐户内的队列。下面的代码使用了后者,我不知道如何读取队列的消息?
非常感谢,
代码示例
StorageCredentials creds = new StorageCredentials(accountname, accountkey);
CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true);
CloudQueueClient queueClient = account.CreateCloudQueueClient();
CloudQueue queue = queueClient.GetQueueReference("test-queue");
queue.CreateIfNotExists();
while (true)
{
CloudQueueMessage message = new CloudQueueMessage(JsonConvert.SerializeObject("my message"));
queue.AddMessage(message);
}
Run Code Online (Sandbox Code Playgroud)
更新
在尝试提供帮助的专家建议的评论和以下链接之后,我尝试了以下代码示例将消息推送到Azure服务总线(即不是存储帐户中的队列)
namespace ConsoleApp1
{
using System;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.ServiceBus;
class Program
{
const string ServiceBusConnectionString = "Endpoint=sb://xxx.servicebus.windows.net/;SharedAccessKeyName=xxx;SharedAccessKey=xxx";
const string QueueName = "name_of_queue";
static IQueueClient queueClient;
public static async Task Main(string[] args)
{
const int numberOfMessages …Run Code Online (Sandbox Code Playgroud) 我有一个微服务(Web API),它将消息发布到主题(主题 A)。
现在我有另一个微服务(Web API),它应该订阅该主题并根据消息采取行动。
我的问题很简单:既然我应该订阅该主题的微服务是 WebApi,我应该如何执行此操作?在我的 Web api 中,我希望以某种方式立即知道主题中何时有新消息可用。我应该通过端点轮询服务总线吗?
我不确定这方面的最佳实践。
我见过的所有使用控制台应用程序进行订阅的示例。但这不是我的情况,因为我有一个网络 API。
我有以下场景:我在 Azure 服务总线中订阅了 2 个微服务,一个微服务用于发送推送通知,另一个微服务用于发送电子邮件,这些微服务永远不会一起工作,因此消息将仅由一个微服务执行。
我正在搜索,看起来将消息发送到主题并使用过滤器来选择应该执行操作的微服务是个好主意。
所以我有两个问题:
我应该使用主题和过滤器吗?不确定是否是更好的做法。
如果是,是否有办法将消息发送到正确的订阅?例如,我向订阅 X 发布一条消息,而不是向所有订阅发布消息。
谢谢
azureservicebus ×10
azure ×5
c# ×4
masstransit ×2
asp.net-core ×1
azure-servicebus-subscriptions ×1
message ×1