首页 > 解决方案 > Azure Java ServiceBus 队列 Java 批量接收或完成消息以获得更好的性能

问题描述

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

以下是我的代码供参考:

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();

我能想到的可能解决方案:

注意:此 API 需要同步。我刚刚尝试了 1000 个条目,但我正在处理 30000 个条目,所以性能很重要。队列也启用了会话并且还启用了分区

标签: azure-servicebus-queuesazure-java-sdk

解决方案


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


推荐阅读