Java 通过Hazelcast队列请求答复

Java 通过Hazelcast队列请求答复,java,hazelcast,Java,Hazelcast,我想知道我是否可以这样做: 1个hazelcast实例/成员(中心点) 1个应用程序,hazelcast客户端通过队列发送请求 1个应用程序,hazelcast客户端正在等待进入队列的请求 第一个应用程序还接收第二个应用程序发布的另一个队列上的响应 这是一个好办法吗?或者你认为有更好的解决办法吗 谢谢 您不能使用相关id在hazelcast中的单个队列上执行请求-应答吗?这是唯一定义队列的两个提供者/使用者之间对话的id。此设置@unludo?的目的是什么?。我只是好奇在过去,我们构建了一个

我想知道我是否可以这样做:

  • 1个hazelcast实例/成员(中心点)
  • 1个应用程序,hazelcast客户端通过队列发送请求
  • 1个应用程序,hazelcast客户端正在等待进入队列的请求
第一个应用程序还接收第二个应用程序发布的另一个队列上的响应

这是一个好办法吗?或者你认为有更好的解决办法吗


谢谢

您不能使用相关id在hazelcast中的单个队列上执行请求-应答吗?这是唯一定义队列的两个提供者/使用者之间对话的id。

此设置@unludo?的目的是什么?。我只是好奇

在过去,我们构建了一个SOA系统,使用Hazelcast队列作为总线。以下是一些标题

a。每个服务都有一个收入Q。服务名就是队列的名称。您可以拥有任意数量的服务提供商。你可以放大和缩小。您所需要的只是这些服务提供者轮询此队列并处理到达的请求

b。由于系统是完全异步的,为了将请求和响应关联起来,在请求和响应上都有一个调用id

c。每个客户机向它想要调用的服务队列发送一个请求。请求包含服务的所有参数、发送响应的队列名称和调用id。队列名称可以是客户端的地址。这样,每个客户机都将拥有自己的唯一队列

d。在接收到请求后,服务提供商将对其进行处理,并将响应发送到应答队列

e。每个客户机还不断轮询其输入队列,以接收其发送的请求的答案


这种设计的主要缺点是队列的可伸缩性不如映射。因此,它的可伸缩性不是很强。无论如何,它仍然可以每秒处理5K个请求

我自己做了一个测试,验证了它在一定的限制下运行良好

体系结构为生产者-黑泽尔卡斯特\节点-消费者

使用两个Hazelcast队列,一个用于请求,一个用于响应,我可以测量不到1ms的往返行程

如果我将多个使用者放入请求队列中,负载平衡工作正常


如果我添加另一个节点,并将客户端连接到每个节点,则往返时间超过15毫秒。这是由于2个hazelcast节点之间的复制造成的。如果我杀死一个节点,客户端将继续工作。因此,故障切换是以时间为代价的。

过去几天,我还研究了一个“类似soa”的解决方案,使用hazelcast队列在不同机器上的不同进程之间进行通信

我的主要目标是

  • “多人一对一”沟通,其中一人承诺回复

  • “一对一”单向沟通

  • “一对一”沟通,在一定时间内回答

  • 长话短说,我今天放弃了这种方法,原因如下:

  • 大量复杂的代码,包括执行器服务、可调用、可运行、中断异常、关机处理、hazelcast事务等

  • 在“一对一”通信中,当接收方的生存期比发送方短时,悬空消息

  • 如果在正确的时间杀死某些群集成员,则会丢失消息

  • 所有集群成员都必须能够对消息进行反序列化,因为它可以存储在任何地方。因此,对于某些客户端和服务,消息不能是“特定的”

  • 我转向了一种更简单的方法:

  • 所有“服务”都使用hazelcast集群成员UUID作为键在MultiMap(“服务注册表”)中注册。每个条目都包含一些元信息,如服务标识符、负载因子、开始时间、主机、pid等

  • 客户端选择该多重映射中某个条目的UUID,并使用DistributedTask(分布式执行器服务)为特定于choosen的集群成员调用该服务,并有选择地(及时)获得回复

  • 只有服务客户机和服务必须在其类路径中具有特定的DistributedTask实现,所有其他集群成员都不必担心

  • 客户端可以很容易地找出服务注册表中的死条目:如果他们看不到具有特定UUID(hazelcastInstance.getCluster().getMembers())的集群成员,服务可能会意外地死掉。然后,客户机可以选择“活动”条目,这些条目的负载因子更小,在幂等服务的情况下重试,等等

  • 使用第二种方法(例如超时或取消任务),编程变得非常简单和强大,需要维护的代码更少


    希望这有帮助

    谢谢你的反馈。关于a,我也使用了一个队列,但没有使用轮询,而是使用了take(),这意味着它是阻塞的。C你是说客户端类型将有其队列?如果每个客户机都有一个队列,那么就创建了直接连接,并放弃了“模块”的概念,即不需要了解其他客户机就可以请求服务。这个概念是要有一个快速的模块化异步体系结构。Modular=每个模块不需要相互了解,每个模块与总线一起工作以请求/应答,然后是独立的。这可以通过ActiveMQ完成,但我认为速度不够快。我认为让总线管理请求的生存期/ttl是个好主意。但我试图避免的是有太多的hazelcast节点,因为节点之间需要复制,这会减慢整体通信。顺便问一下,您的客户机是通过总线通知的,还是执行了一系列轮询?在我的第一种方法——基于队列的方法中,使用IQueue的客户机只对这个单一回复IQueue实例进行了特殊处理。