首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure Java ServiceBus队列Java批量接收或完成消息,以获得更好的性能

Azure Java ServiceBus队列Java批量接收或完成消息,以获得更好的性能
EN

Stack Overflow用户
提问于 2021-08-25 21:23:48
回答 1查看 187关注 0票数 1

我正在尝试接收来自队列的消息,并尝试了不同的方法,并面临性能问题。以下是每种运行类型的度量标准:

  • 接收模式= peek和lock;1000条消息花了2.5分钟,因为我必须逐一完成每条消息
  • 接收模式=接收和删除;1000条消息平均花费1.5分钟。
  • 接收模式=接收和删除(预取计数为100);1000条消息花费了3秒,但我最终丢失了执行结束时缓冲区中的100条消息
  • 接收模式= peek和lock (预取计数为100);1000消息花费了2分钟,因为我必须再次完成每条消息。只有当有一种方法在批处理中完成时,它才会是一个问题解决者。

以下是我的代码供参考:

代码语言:javascript
复制
ServiceBusSessionReceiverClient sessionReceiverClient = new ServiceBusClientBuilder()
            .connectionString(System.getenv("QueueConnectionString"))
            .sessionReceiver()
            .maxAutoLockRenewDuration(Duration.ofMinutes(2))
            .receiveMode(ServiceBusReceiveMode.PEEK_LOCK)
            .queueName(queueName)
            .buildClient();
ServiceBusReceiverClient receiverClient = sessionReceiverClient.acceptSession(System.getenv("QueueSessionName"));
ObjectMapper objectMapper = new ObjectMapper();
    do {
        receiverClient.receiveMessages((int) prefetchCount).stream().forEach(message -> {
            try {
                String str = message.getBody().toString();
                final T dataDto = objectMapper.readValue(message.getBody().toString(), returnType);
                dataDtoList.add(dataDto);
                receiverClient.complete(message);
            } catch (Exception e) {
                AzFaUtil.getLogger().severe("Message processing failed.  Error: " + e.getMessage() + e + "\n Payload: "
                            + message);
            }
        });
    } while (dataDtoList.size() < numberOfMessages);
receiverClient.close();
sessionReceiverClient.close();

我能想到的可能的解决办法:

  • 如果有一种方法可以成批地完成消息,而不是完成1×1。
  • 如果有一种方法可以将消息请求回位于预取缓冲区中的队列。

注意:这个API需要是同步的。我刚刚实验了1000个条目,但是我正在处理30000个条目,所以性能很重要。此外,队列已启用会话,也支持分区的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-19 17:28:27

按照本期的说法,微软还没有测试他们ServiceBus的性能。由于FIFO (先进先出)是我的消息队列的一个要求,所以我使用JMS,它平均执行速度快10倍,但也有一个缺点。目前,JMS不支持基于会话的队列,因此我不得不禁用会话,然后为了确保FIFO,我还必须禁用队列上的分区。这是一个部分和临时的解决方案,以获得更好的性能,直到微软提高其ServiceBusRecieverClient的性能或启用JMS上的会话为止。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68930028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档