我在消费计划上运行了一个由服务总线主题触发的azure函数,然后只是将另一个消息添加到队列中(所以基本上没有处理,只有IO)。触发主题以~1000 /秒的速率填充。我天真地认为这个功能可以很容易地保持同步,但事实上它已经无可救药地被压倒了,主题订阅很快就会填满。我已经运行了几个小时,所以我怀疑它已完全扩展。
我应该从功能中获得多少性能?吞吐量大约是每秒数千个?
编辑:我经常在日志中看到此错误:
连接尝试持续时间跨度为00:00:00。 TCP错误 代码10013:尝试以禁止的方式访问套接字 通过其访问权限。
看起来功能在大规模服务总线上效果不佳?
编辑2解决方案 替换此绑定:
public static async Task Run(BrokeredMessage msgin, Binder binder, TraceWriter log)
{
var collector = await binder.BindAsync<IAsyncCollector<BrokeredMessage>>(
new ServiceBusAttribute("my-queue"));
...
}
用这个:
public static IAsyncCollector<BrokeredMessage> collector;
public static async Task Run(BrokeredMessage msgin, Binder binder, TraceWriter log)
{
collector = collector ?? await binder.BindAsync<IAsyncCollector<BrokeredMessage>>(
new ServiceBusAttribute("my-queue"));
...
}
阻止了套接字耗尽,并且该功能能够与生产者保持同步没有问题。
答案 0 :(得分:3)
有些问题:
host.json
?您看到的错误与连接耗尽有关,因此您的函数实例会以某种方式耗尽可用连接。
如果你想获得关于功能缩放和遥控的遥测?吞吐量你可以给这个镜头:https://github.com/Azure/Azure-Functions/wiki/App-Insights-Early-Preview
答案 1 :(得分:3)
我在Azure功能中遇到了同样的问题。根本原因是我耗尽了所有端口,因为我在Run方法中创建了一个TCP连接。
因此,当同一台机器上有很多并行执行时,它们都会创建连接,最终耗尽所有端口。
在这种情况下,连接是作为ServiceBus客户端创建的一部分创建的,将其移动到静态变量可以解决问题。