我想知道我是否可以请求回复:
第一个应用程序还会收到第二个应用程序发布的另一个队列的响应。
这是一个好的方法吗?或者你认为有更好的解决方案吗?
谢谢!
答案 0 :(得分:3)
最近几天,我还使用hazelcast队列在不同机器上的不同进程之间进行通信,从而制定了“类似”的解决方案。
我的主要目标是
“一对多”的沟通与许多人之一的保证回复
“一对一”沟通单向
“一对一”在一定时间内回答的沟通
总而言之,由于以下原因,我今天放弃了这种方法:
许多复杂的代码包含执行服务,callables,runnables,InterruptedException,shutdown-handling,hazelcast Transactions等
当接收者的生命周期比发送者短时,在“一对一”通信的情况下悬挂消息
如果我在合适的时间杀死某些集群成员,则会丢失消息
所有集群成员必须能够反序列化消息,因为它可以存储在任何位置。因此,对于某些客户端和服务,消息不能“特定”。
我转而采用了一种更为简单的方法:
所有“服务”使用hazelcast集群成员UUID作为密钥在MultiMap(“服务注册表”)中注册自己。每个条目都包含一些元信息,如服务标识符,加载因子,启动时间,主机,pid等。
客户端选择该MultiMap中其中一个条目的UUID,并使用DistributedTask(分布式执行程序服务)为选择的特定集群成员调用服务,并可选择获取答复(及时)
只有服务客户端和服务必须在其类路径中具有特定的DistributedTask实现,所有其他集群成员都不会受到干扰
客户端可以很容易地在服务注册表中找出死的条目:如果他们看不到具有特定UUID的集群成员(hazelcastInstance.getCluster(。。getMembers()),则该服务可能意外死亡。然后,客户端可以选择“活动”条目,负载因子较少的条目,在幂等服务的情况下重试等等
使用第二种方法(例如超时或取消任务),编程变得非常简单和强大,更少的代码需要维护。
希望这有帮助!
答案 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的目的是什么?我很好奇