azureservicebus - 加快发送消息
问题描述
我有一个天蓝色的功能,可以向服务总线发送大约 20k 条消息。首先,我开始进行等待操作,但意识到这太慢了。之后我尝试了没有等待,这加快了速度。但是,我不能在发送所有消息之前从我的 azyre 函数返回,因为这会终止进程。然后我尝试了以下操作:
string queuePath = "xx";
var queueClient = new QueueClient(_serviceBusConnectionString, queuePath);
foreach(var tenantSite in tenatSites)
{
var jsonStr = JsonConvert.SerializeObject(tenantSite);
string messageBody = jsonStr;
var message = new Microsoft.Azure.ServiceBus.Message(Encoding.UTF8.GetBytes(messageBody));
var task = queueClient.SendAsync(message);
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
这里的问题是它似乎在等待所有消息被处理而不是仅仅被传递。将大量消息发送到服务总线并等待所有传递(未处理)的正确方法是什么?
解决方案
看看 Bindings 可以为您做什么。特别是在您的情况下:Azure Functions 的 Azure Service Bus 绑定。
更具体地说:使用ICollector<T>
or IAsyncCollector<T>
is there 来创建多条消息。调用 Add 方法时会创建一条消息。
示例实现如下所示:
[FunctionName("FunctionName")]
public static void Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "some-route")] HttpRequest req,
[ServiceBus("some-queue-name", Connection = "ServiceBusConnectionSend", EntityType = EntityType.Queue)] ICollector<string> queueCollector,
string name, ILogger log)
{
Parallel.ForEach(tenantSites, (tenantSite) =>
{
var jsonStr = JsonConvert.SerializeObject(tenantSite);
queueCollector.Add(tenantSite);
});
}
推荐阅读
- javascript - 谷歌地图在多个标记上的点击事件
- apache-spark - CentOS6.8,Hive:无法实例化 org.apache.hadoop.hive.metastore.HiveMetaStoreClient
- tensorflow - 展平批次中索引 2 处的张量流计数 0
- mysql - 使用 PHP PDO 进行双重分组
- reactjs - React 应用程序是否必须在自己的服务器进程上运行?
- c - 将用户输入存储到两个数组时中止陷阱
- python - 合并多个 Json 并通过 python 读取时出错
- mongodb - MongoDB 中的 Spring Boot 动态更新
- ios - 用于回复 App Store 评论的 API?
- r - 曲线下的填充区域 - R 图