在异步消息传递中,客户代理通信是同步的吗?
In asynchronous messaging, is client-broker communication synchronous?
在 Chris Richardson(2019 年)的微服务模式一书的第 67 页上讨论异步消息时,作者写道:
Synchronous—The client expects a timely response from the service and might even block while it waits.
Asynchronous - The client doesn’t block, and the response, if any, isn’t necessarily sent immediately
鉴于此,从“同步”到“异步”通信似乎实际上只是将一个同步服务(例如,服务 A)与不同的同步服务(例如,消息代理上的侦听端口,如 Active)交换MQ、Kafka、IBM MQ、AWS Kinesis 等)。
那是因为客户端在与代理通信时可能仍必须阻塞(或至少使用池中的 1 个线程或连接),而不是直接与服务 A 通信——特别是因为客户端可能期望出于可靠性目的的代理响应(例如,SUCCESS)。
分析正确吗?
是的,你的分析是正确的。
针对您的案例,代理的客户端库向调用方代码(例如 ServiceA
)提供异步功能,which means that it doesn't block the ServiceA's thread until the operation is finished
,但它允许您提供将被调用的回调(异步操作的结果)完成时。
现在的问题是:谁将调用该回调?嗯,来自代理客户端库的一些代码,它运行在一个线程上,该线程可能会定期检查操作是否完成(或最终会发出此结果的任何其他逻辑)。
所以是的,必须有一些后台线程做一些同步工作来获取这些结果。
在 Chris Richardson(2019 年)的微服务模式一书的第 67 页上讨论异步消息时,作者写道:
Synchronous—The client expects a timely response from the service and might even block while it waits.
Asynchronous - The client doesn’t block, and the response, if any, isn’t necessarily sent immediately
鉴于此,从“同步”到“异步”通信似乎实际上只是将一个同步服务(例如,服务 A)与不同的同步服务(例如,消息代理上的侦听端口,如 Active)交换MQ、Kafka、IBM MQ、AWS Kinesis 等)。
那是因为客户端在与代理通信时可能仍必须阻塞(或至少使用池中的 1 个线程或连接),而不是直接与服务 A 通信——特别是因为客户端可能期望出于可靠性目的的代理响应(例如,SUCCESS)。
分析正确吗?
是的,你的分析是正确的。
针对您的案例,代理的客户端库向调用方代码(例如 ServiceA
)提供异步功能,which means that it doesn't block the ServiceA's thread until the operation is finished
,但它允许您提供将被调用的回调(异步操作的结果)完成时。
现在的问题是:谁将调用该回调?嗯,来自代理客户端库的一些代码,它运行在一个线程上,该线程可能会定期检查操作是否完成(或最终会发出此结果的任何其他逻辑)。
所以是的,必须有一些后台线程做一些同步工作来获取这些结果。