我有一个持久编排客户端,它是由服务总线主题触发的。
[FunctionName("ServiceBusTrigger")]
public static async Task ServiceBusTrigger(
[ServiceBusTrigger("topicname", "subscriptionname", Connection = "MyServiceBusKey")]string mySbMsg,
[OrchestrationClient]DurableOrchestrationClient starter,
ILogger log)
{
string instanceId = await starter.StartNewAsync("Orchestrator", mySbMsg);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
}
Run Code Online (Sandbox Code Playgroud)
在扩展下启用预取计数是否会host.json导致在服务总线触发器中预取消息?
host.json:
{
"version": "2.0",
"extensions": {
"serviceBus": {
"prefetchCount": 100
}
}
}
Run Code Online (Sandbox Code Playgroud) 有谁知道天蓝色服务总线中的接收和查看选项之间的区别?
var client = new MessageReceiver("ServiceBusConnectionString", "Queue");
// difference between this one:
var peekResults = await client.PeekAsync(100);
// and this one
var receiveResults = await client.ReceiveAsync(100);
Run Code Online (Sandbox Code Playgroud)
我发现我可以得到相同的结果,但我想知道我应该使用哪一个以及为什么?那么内部会有什么区别呢?
总结一下问题:
我正在尝试在 Azure 服务总线上发送包含主题和订阅的 CSV 文件。我按照这里的官方快速入门,成功连接了 ASB,并打印了消息。我想做的下一步是在 ASB 上发送 CSV 文件,以便侦听器复制文件。CSV 文件当前位于 docker 内。可以发送 CSV 文件吗?如果是这样,怎么办?非常感谢任何可以引导我走向正确方向的有用资源。
我尝试过的:
主题和订阅已由另一个团队创建。连接字符串只有发送和监听的权限。基本上只需遵循快速启动即可:
from azure.servicebus.control_client import ServiceBusService, Message, Topic, Rule, DEFAULT_RULE_NAME
conString = '<connection string>'
azure_namespace = 'abc'
key_name = 'xyz'
key_value = '1q2w3e4r5t6y7u8i9o='
bus_service = ServiceBusService(
service_namespace=azure_namespace,
shared_access_key_name=key_name,
shared_access_key_value=key_value)
conTopic = 'mytopic'
conSubscription = 'mysubscription'
# send message to a topic
for i in range(5):
msg = Message('Msg {0}'.format(i).encode('utf-8'))
bus_service.send_topic_message(conTopic, msg)
# receive messages from a subscription
msg = bus_service.receive_subscription_message(conTopic, conSubscription)
print(msg.body) …Run Code Online (Sandbox Code Playgroud) 我有许多 CRUD API,它们通过 HTTP 调用 (.NET 5) 相互通信。
为了避免打开太多的 tcp 连接,我在所有这些服务中通过 DI使用HttpClientFactory 。这效果很好,我没有遇到太多通过 HTTP 打开的连接。
但我的 Azure 应用服务仍然抱怨 SNAT 连接过多:
我猜原因是Azure服务总线。我的 API 的每次调用都会将事件写入总线。
为此,我在每次调用时创建一个新实例:
await using (ServiceBusClient client = new ServiceBusClient(_serviceBusConnectionString))
{
var messageObject = new { message.Name, message.Body };
var messageJson = JsonConvert.SerializeObject(messageObject);
ServiceBusSender sender = client.CreateSender(_topicName);
await sender.SendMessageAsync(new ServiceBusMessage(messageJson));
}
Run Code Online (Sandbox Code Playgroud)
许多开发人员都像这样使用 HttpClient(这是一个坏主意,请阅读上面的文章中的原因)。HttpClient 的解决方案是 .NET 为此目的提供的 AddHttpClient 方法。
但是 Azure 服务总线呢?没有什么像 AzureServiceBusFactory 之类的东西,将 AzureServiceBus 添加为单例并不是一个好主意,因为每次调用的配置都应该不同。
如何确保连接池也重新用于 Azure 服务总线连接?我错过了什么最佳实践吗?或者您认为连接问题还有其他原因吗?
编辑:
接受的答案是正确的。这工作正常,我的错误消失了。只需使用以下命令添加服务总线客户端:
services.AddAzureClients(cfg =>
{
cfg.AddServiceBusClient("your-connection-string");
});
Run Code Online (Sandbox Code Playgroud)
之后,您就可以在您的所有服务中轻松通过 DI …
我知道如何从一个队列自动转发到另一个队列,但是,我需要将消息从死信转发到另一个常规队列,我想知道是否可以在没有任何外部应用程序获取这些消息并将其发送到队列的情况下实现这一目标。
我需要一个关于如何在服务总线队列上进行 CRUD 操作的示例。
我实际上需要 Microsoft.Azure.Management.ServiceBus.SBQueue 类的实例,以便我可以计算该队列中的消息。
我有一条服务总线消息,其中ApplicationProperties添加了一些内容:
ServiceBusMessage serviceBusMessage
serviceBusMessage.ApplicationProperties.Add("TenantId", tenantId);
serviceBusMessage.ApplicationProperties.Add("Serialization", "JSON");
Run Code Online (Sandbox Code Playgroud)
我需要从我的 Azure 函数访问这些。在类库风格的函数应用程序中,我可以使用,但ServiceBusReceivedMessage在进程外似乎没有等效的东西?
我正在开发一个带有 ServiceBusTrigger 队列的 Azure Function(进程内模型,V 4.1)。该函数工作正常并被触发。该函数如下所示:
public async Task Run([ServiceBusTrigger("my-queue", Connection = "myConnectionString", AutoCompleteMessages = true)]
string myQueueItem, Int32 deliveryCount, DateTime enqueuedTimeUtc, string messageId)
Run Code Online (Sandbox Code Playgroud)
我现在希望能够获取我在消息中传递的correlationId,并且我希望能够自己“Complete()”消息。
我在这里查看了文档(https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus-trigger?tabs=in-process%2Cextensionv5&pivots=programming-language-csharp)但没有找到任何方法来绑定其他参数,如 Message、MessageReceiver 等。每当我尝试使用这些参数时,函数运行时都会出现绑定异常。
这些是我正在使用的相关包
<PackageReference Include="Azure.Messaging.ServiceBus" Version="7.7.0" />
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Core" Version="1.4.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.3.0" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.0" />
Run Code Online (Sandbox Code Playgroud)
我一定错过了一些东西......任何提示都会受到赞赏!
编辑:清理后,这些是相关的包:
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.3.0" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="6.0.3" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.0" />
Run Code Online (Sandbox Code Playgroud) 我正在尝试侦听可以包含具有多种事件类型的消息的服务总线。当消息到达时,我想根据事件类型对其进行处理。我有 2 个 azure 函数来处理不同的事件类型消息,但是当一个函数接收到消息时,另一个函数不会被触发。是否可以同时触发它们并让它们决定由哪一个处理消息?
这是一些示例代码,它们位于两个独立的项目中:
[FunctionName("Function1")]
public async Task RunAsync(
[ServiceBusTrigger("queueName", Connection = "connectionName")]
Message message,
MessageReceiver messageReceiver,
ILogger log)
{
var body = Encoding.Default.GetString(message.Body);
var messageType = _helper.GetMessageType(body);
if (messageType is not MessageType.Type1)
return;
// business logic
await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
}
[FunctionName("Function2")]
public async Task RunAsync(
[ServiceBusTrigger("queueName", Connection = "connectionName")]
Message message,
MessageReceiver messageReceiver,
ILogger log)
{
var body = Encoding.Default.GetString(message.Body);
var messageType = _helper.GetMessageType(body);
if (messageType is not MessageType.Type2)
return;
// business logic
await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
}
Run Code Online (Sandbox Code Playgroud) 已经有原生解决方案了吗?