Hazelcast 成员之间的高延迟(使用主题 publish/onMessage)

High Latency between Hazelcast members (using Topic publish/onMessage)

我在两个 Azure VM(标准 D3)上使用 Hazelcast (v3.5.4) Topics 作为一个非常简单的聊天应用程序 运行。

发布消息时,有时其他成员最多需要 15 秒才能收到消息。 我记录了 publish 和 onMessage 方法,以明确 hazelcast 导致了延迟。 没有网络延迟,应用程序和虚拟机使用的 CPU 资源几乎为零。 什么会导致这样的延迟?

用于消息传递的主题:

private ITopic<ChatMessage> eventTopic;

@PostConstruct
private void init() {
    eventTopic = hazelcastInstance.getTopic("chat-messages");
    eventTopic.addMessageListener(new ChatMessageListener());
}

public void publishMessage(final ChatMessage chatMessage) {
    log.debug("Publish message: " + chatMessage.toString());
    eventTopic.publish(chatMessage);
}

两个 azure 虚拟机在同一区域,这两个虚拟机之间的延迟 (Ping) 小于 5 毫秒。

禁用多播加入,使用静态 TcpJoin:

@Bean
public HazelcastInstance hazelcastInstance() {
    final Config config = new Config();
    NetworkConfig networkConfig = config.getNetworkConfig();

    networkConfig.setPort(5701);
    networkConfig.setPortAutoIncrement(true);
    networkConfig.setPortCount(3);
    networkConfig.getInterfaces()
        .addInterface("10.0.0.*")
        .setEnabled(true);
    final JoinConfig join = networkConfig.getJoin();
    join.getAwsConfig().setEnabled(false);
    join.getMulticastConfig().setEnabled(false);
    join.getTcpIpConfig().addMember("10.0.0.1-2").setEnabled(true);

    return HazelcastInstanceFactory.newHazelcastInstance(config);
}

Spring Boot 1.3 与 hazelcast-spring 3.5.4

一起使用

15 秒很多(就像疯了一样)。也许时钟与机器不同步?

您能否更改您的应用程序,使 memberA 向 memberB 发布消息,而 memberB 向 memberA 发布回复。

您在 memberA 上测量 RTT(往返时间),然后将其除以 2 以查看一条消息 send/receive 花费了多少时间。至少这样你就摆脱了系统时钟的任何问题。

在 Azure 上,有一些针对 Azure VM 的概念 Availability SetVirtual Network

Availability Set 可以帮助将您的 VM 加入虚拟网络,以提高 Region/Virtual Network 下的通信能力。

您可以尝试使用Availability SetVirtual Network来解决问题,请参考这些文档https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-how-to-configure-availability/ and https://azure.microsoft.com/en-us/documentation/articles/virtual-networks-create-vnet-arm-pportal/来解决。

同时,有一份白皮书 (https://hazelcast.com/resources/whitepaper-best-practices-azure/),您可以在 Hazelcast 官方资源中心请求下载 link 主题 "Hazelcast on Azure: Best Practices for Deployment"。

您可以按照白皮书的内容配置网络,降低网络延迟。

感谢您的回复, 我在我使用的 MessageListener 中找到了延迟的原因

message.getPublishingMember().getSocketAddress().getHostName()

用于日志记录。 在 windows 台机器上,getHostName 方法有时需要 15 秒。