我有一个从 JavaScript 接收 XmlHttpRequests 的 WebApi2 控制器。
我每秒对 api 进行 +500 次调用,任何请求都会执行一些快速计算,然后我创建一个 Azure 存储队列(不是服务总线),传入一个序列化对象以供以后处理。直到这里一切正常,问题是 10-15% 的时间,仅初始化存储队列并添加 20k JSON 消息需要 500 毫秒到 2 秒之间的时间。我将请求分片到 10 个不同的队列中,但问题仍然存在,并且似乎与流量无关,基本上有时队列只是卡在创建过程中并变慢。
我已经禁用了 Nagle 和 Expect100Continue。
我想将这种架构转换为使用 EventHUbs,因为可能我的情况需要事件摄取器而不是简单的队列,需要最大速度。
但是EventHub的初始化有同样的问题!有时启动和接收一条消息需要 2 或 3 秒,平均为 400 毫秒。
我用秒表测量了速度。
这是我在 API 控制器中的代码:
var eventHubClient = StorageHelpers.InitializeEventHub("name", "Send");
await eventHubClient.SendAsync(new EventData(Encoding.UTF8.GetBytes(QueueSerialized)));
InizializeEventHub 在哪里:
public static EventHubClient InitializeEventHub(string eventHubName, string type)
{
string connectionString = RoleEnvironment.GetConfigurationSettingValue("Hub"+type+eventHubName);
return EventHubClient.CreateFromConnectionString(connectionString, eventHubName);}
该服务使用云服务托管在 Azure 上,托管在 ServiceBus 和存储的同一位置 (WestUS)。
我的问题是:
- 1)初始化连接的这段时间是否正常?
- 2)Web Api 有没有办法为所有调用共享同一个 EventHubClient 实例?Redis 在 Lazy 类中使用 ConnectionMultiplexer 完成了类似的操作。
- 3) 我可以缓存 EventHubClient 对象吗?
对此问题的任何帮助将不胜感激,如果有某种方法可以加快初始化和 AddMessageAsync 操作,我什至可以返回存储队列。
谢谢