如何通过AMQP 1.0在Azure事件中心中的批处理中接收许多消息



i仅使用Apache QPID Electron go包装器QPID质子的QPID Electron设置一个AMQP 1.0链接,例如:

amqpConnection.Receiver(
            // the path containing the consumer group
            // and the partition Id
            electron.Source("<EVENTHUB_PATH>"),
            // the filter map contains some annotations filters 
            // for the Event Hub offset
            electron.Filter(filterMap), 
)

我遵循此文档设置AMQP链接选项:https://godoc.org/qpid.apache.org/electron#linkoption

但是,在运行GO应用程序时,我意识到它在获取消息方面非常慢,因此我添加了2个链接选项:

amqpConnection.Receiver(
            electron.Source("<EVENTHUB_PATH>"),
            electron.Capacity(100),
            electron.Prefetch(true),
            electron.Filter(filterMap),
)

但是添加容量和预取链接选项后,我看不出性能的任何改进

我从4个并行链接(每个分区一个链接)每〜5秒收到大约10条消息。

我尝试使用QPID质子的详细输出的环境变量PN_TRACE_RAW=true运行该应用程序(参见此:https://qpid.apache.org/releases/qpid-proton-0.18.0/proton/proton/c/api/group__transport.html),但我不确定关于我应该寻找什么来解决这个问题。

我认为QPID设置没有任何问题,但是无论如何这是我在终端上看到的:

[0x9fd490]:0 -> @attach(18) [name="<MY_CUSTOM_NAME>",
handle=1, role=true, snd-settle-mode=0, rcv-settle-mode=0, source=@source(40) [address="<MY_CUSTOM_PATH>",
durable=0, expiry-policy=:"link-detach", timeout=0, dynamic=false, filter={:string=@:"apache.org:selector-filter:string"
"amqp.annotation.x-opt-offset > '<MY_CUSTOM_OFFSET>'"}], target=@target(41) [address="",
durable=0, expiry-policy=:"link-detach", timeout=0, dynamic=false], initial-delivery-count=0,
max-message-size=0]
[0x9fd490]:0 -> @flow(19) [next-incoming-id=1, incoming-window=2147483647, next-outgoing-id=1,
outgoing-window=0, handle=1, delivery-count=0, link-credit=100, drain=false]

我还尝试在与事件中心相同的Azure位置以Azure VM运行GO应用程序,但性能没有改善。

我如何在同一"往返"中同时获取许多消息?我需要每秒处理数千条消息。

您需要一个预取窗口,但是电子客户端可以做得更好。

我从https://github.com/apache/qpid-proton/tree/master/master/master/go/go/electron

进行了快速测试。

我即使没有预取,也可以得到3000毫秒/秒,而将近10000毫克/秒。

$ ./broker -qsize 100000 &
Listening on [::]:5672
$  ./send -count 10000 /x ; time ./receive -count 10000 /x
Received all 10000 acknowledgements
Listening on 1 connections
Received 10000 messages
real    0m2.612s
user    0m1.611s
sys 0m0.510s
$  ./send -count 10000 /x ; time ./receive -count 10000 -prefetch 1000 /x
Received all 10000 acknowledgements
Listening on 1 connections
Received 10000 messages
real    0m1.053s
user    0m1.272s
sys 0m0.277s

显然发生了一些有趣的事情 - 我想帮助您到达底部。

pn_trace_raw有点冗长,无法有所帮助,尝试pn_trace_frm = 1,它将为您提供更可读的摘要。

我很乐意在此处或在users@qpid.apache.org上继续对话,如果它变成了支持案例,而不是一个问题/答案。

相关内容

  • 没有找到相关文章

最新更新