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 Set
和 Virtual Network
。
Availability Set
可以帮助将您的 VM 加入虚拟网络,以提高 Region/Virtual Network
下的通信能力。
您可以尝试使用Availability Set
和Virtual 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 秒。
我在两个 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 Set
和 Virtual Network
。
Availability Set
可以帮助将您的 VM 加入虚拟网络,以提高 Region/Virtual Network
下的通信能力。
您可以尝试使用Availability Set
和Virtual 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 秒。