2017-08-09 20 views
0

我有两个休息API。我使用Spring Boot和MongoDB。当两个REST端点读取相同的数据时处理延迟问题

首先,客户端调用将记录插入到mongo集合中的api1。 然后几秒钟后,api2尝试读取插入记录并执行一些过程。

但有时候会出现这样的情况,当api2尝试读取记录时,由于api1的延迟而没有插入集合。

在这种情况下,api2无法执行此过程。

我可以想到的一个选项,当api2读取记录时,如果它仍然没有插入到mongo中,请将睡眠时间睡几秒钟并唤醒它(可以做几次直到记录存在)

我还有其他选择吗?

更新: 这两个API是独立的。流程就像在完成上传视频时调用api1并插入带有refid和流程完成的媒体。然后,应用程序在视频转码完成后(通常在30秒左右之后)用refid接收从外部视频处理系统到api2的回叫,然后api2对插入的媒体进行一些更新。有一个边缘的情况下,对于非常小的视频外部视频系统的行动很快,并给出回调,那时我的应用程序仍然插入媒体到mongo

+0

为什么不使用事件系统?把你的数据放到一个代理中,然后由一个监听器处理,这个监听器会处理和存储数据到DB – wargre

+0

@wargre那么这两个API是独立的。流程就像在完成上传视频时调用api1并插入带有refid和流程完成的媒体。然后,应用程序在视频转码完成后(通常在30秒左右之后)用refid接收从外部视频处理系统到api2的回叫,然后api2对插入的媒体进行一些更新。有一个边缘情况,对于非常小尺寸的视频,外部视频系统动作迅速,并提供回调,那时我的应用程序仍然将媒体插入到mongo中。 – Harshana

+0

@Harshana,听起来有点太复杂了......我还是会用api1去调用api2,一旦它完成,或者api1发布事件,然后想要(在你的情况下是api2)注册这个事件并且需要行动。 –

回答

1

我建议你的api1一旦完成调用api2和传递它插入的id。这样api2永远不会过早运行。另一种方法是使用api1放置消息的队列,并且api2使用该消息并对其进行处理(信任给在他的评论中提到它的@warge用户)

+0

我对@warge添加了评论。请看看 – Harshana

0

从您的用例中,您没有太多的选择。

干净的方法是在上传时创建文档,以便api1和api2将被更新,并且不会有“找不到”异常。