【发布时间】:2017-12-12 11:42:27
【问题描述】:
我从官方文档中阅读了有关 RPC 模式的信息,但是示例非常简单。客户端发送一条带有reply_to和correlation_id属性的消息,服务器从队列中获取一条消息并重新发送给绑定相同correlation_id的客户端。
我的问题是:
1)如果服务器关闭,客户端如何得到响应
2) 如何在客户端设置 RPC 超时时间
3) 如果服务器坏了抛出异常,我们应该把这个异常发送给客户端
我将不胜感激。
【问题讨论】:
我从官方文档中阅读了有关 RPC 模式的信息,但是示例非常简单。客户端发送一条带有reply_to和correlation_id属性的消息,服务器从队列中获取一条消息并重新发送给绑定相同correlation_id的客户端。
我的问题是:
1)如果服务器关闭,客户端如何得到响应
2) 如何在客户端设置 RPC 超时时间
3) 如果服务器坏了抛出异常,我们应该把这个异常发送给客户端
我将不胜感激。
【问题讨论】:
将服务器用于确认 RPC 调用是一种很好的做法。 RabbitMQ docs(在 Python 部分)中描述的类似内容:
虽然不太可能,但 RPC 服务器可能会在向我们发送答案之后,但在发送请求的确认消息之前死亡。如果发生这种情况,重新启动的 RPC 服务器将再次处理该请求。这就是为什么在客户端我们必须优雅地处理重复响应,并且 RPC 应该是理想的幂等。
您可以为消息或整个队列设置 TTL:https://www.rabbitmq.com/ttl.html
视情况而定。如果请求是幂等的,则可以不确认消息 - 另一个工作人员将处理它。但它可能成为毒丸:此类请求将填满您的 RPC 队列并导致 DoS。因此,您可以手动处理它,例如使用 retry_count 标头(如果失败的工人重新排队消息,计数器递减)
【讨论】: