假设有两个工具,工具A和工具B。当工具A运行并完成时,工具B可能需要做一些事情。执行工具A需要很长时间(> 60秒),而且通常工具B没有什么要做的。工具A为工具B提供一些元数据,以便工具B知道该做什么。
基于消息的解决方案:建立一个消息队列,工具B正在消费它。如果执行了工具A,并且应该运行工具B,则工具A会发布一条包含元数据的消息(包括元数据)到队列中,工具B接收到该消息后将使用该消息中的元数据进行运行。
数据库解决方案:每当工具A运行时,它都会添加一个数据库记录,其中包含时间戳、元数据和状态“RUNNING”。如果执行了工具A并且应该运行工具B,它将更新DB记录状态为“NEXT_TOOL_B”。工具B不断查询状态为“NEXT_TOOL_B”的记录。如果发现了有东西,工具B将使用数据库记录中的元数据进行运行。
虽然我知道数据库解决方案的缺点,例如来自工具B的连续轮询,但我在基于消息的解决方案中错过了一个功能:
每当第三个工具(例如控制面板UI)想要知道当前状态时,它也可以随时查询数据库,并且如果工具A仍在工作,则会在其中找到“RUNNING”状态。在消息解决方案中,我真的看不到一种“监视”状态的方法,除非完成消息将在队列上。
所以我的问题是,您是否能够想出一种方法来实现这一点,使用消息或任何其他不需要轮询的方法?