使用Hazelcast通过队列回复请求

时间:2013-01-21 17:53:00

标签: java hazelcast

我想知道我是否可以请求回复:

  • 1个hazelcast实例/成员(中心点)
  • 1个使用hazelcast-client通过队列发送请求的应用程序
  • 1个使用hazelcast-client等待请求进入队列的应用程序

第一个应用程序还会收到第二个应用程序发布的另一个队列的响应。

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

谢谢!

5 个答案:

答案 0 :(得分:3)

最近几天,我还使用hazelcast队列在不同机器上的不同进程之间进行通信,从而制定了“类似”的解决方案。

我的主要目标是

  1. “一对多”的沟通与许多人之一的保证回复

  2. “一对一”沟通单向

  3. “一对一”在一定时间内回答的沟通

  4. 总而言之,由于以下原因,我今天放弃了这种方法:

    1. 许多复杂的代码包含执行服务,callables,runnables,InterruptedException,shutdown-handling,hazelcast Transactions等

    2. 当接收者的生命周期比发送者短时,在“一对一”通信的情况下悬挂消息

    3. 如果我在合适的时间杀死某些集群成员,则会丢失消息

    4. 所有集群成员必须能够反序列化消息,因为它可以存储在任何位置。因此,对于某些客户端和服务,消息不能“特定”。

    5. 我转而采用了一种更为简单的方法:

      1. 所有“服务”使用hazelcast集群成员UUID作为密钥在MultiMap(“服务注册表”)中注册自己。每个条目都包含一些元信息,如服务标识符,加载因子,启动时间,主机,pid等。

      2. 客户端选择该MultiMap中其中一个条目的UUID,并使用DistributedTask(分布式执行程序服务)为选择的特定集群成员调用服务,并可选择获取答复(及时)

      3. 只有服务客户端和服务必须在其类路径中具有特定的DistributedTask实现,所有其他集群成员都不会受到干扰

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

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

        希望这有帮助!

答案 1 :(得分:2)

过去,我们构建了一个使用Hazelcast队列作为总线的SOA系统。以下是一些头条新闻。

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

湾由于系统是完全异步的,为了关联请求和响应,在请求和响应时都有一个呼叫ID。

℃。每个客户端都将请求发送到要调用的服务的队列中。该请求包含服务的所有参数,发送响应的队列名称和呼叫ID。队列名称只能是客户端的地址。这样每个客户端都拥有自己独特的队列。

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

即每个客户端还连续轮询其输入队列以接收其发送的请求的答案。

这种设计的主要缺点是队列不像地图那样可扩展。因此,它不是很可扩展。但它仍然可以每秒处理5K请求。

答案 2 :(得分:1)

您不能使用相关ID在hazelcast中对单个队列执行请求 - 回复吗?这是唯一应该在队列的2个提供者/消费者之间定义对话的id。

答案 3 :(得分:1)

我为自己做了一个测试,并验证它在某些限制下效果很好。

该架构是Producer-Hazelcast_node-Consumer(s)

使用两个Hazelcast队列,一个用于请求,一个用于响应,我可以测试一次不到1毫秒的往返。

如果我放置了Request队列的几个使用者,那么负载平衡工作正常。

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

答案 4 :(得分:0)

这个设置@unludo的目的是什么?我很好奇