我正在使用 Hazelcast (v3.5.4) 主题来构建在两个 Azure VM(标准 D3)上运行的非常简单的聊天应用程序。
发布消息时,有时其他成员最多需要 15 秒才能收到。 我记录了发布和 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 一起使用
最佳答案
谢谢您的回复, 我在我使用的 MessageListener 中找到了延迟的原因
message.getPublishingMember().getSocketAddress().getHostName()
用于记录。 在 Windows 计算机上,getHostName 方法有时需要长达 15 秒的时间。
关于java - Hazelcast 成员之间的高延迟(使用主题发布/onMessage),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34209222/