我有一个连接到外部Web服务的应用程序。Web 服务将带有 ID 的消息发送到 laravel 应用程序。在控制器中,我检查数据库中是否已存在消息的 ID。如果没有,我将消息与 ID 一起存储,如果存在,我将跳过消息。
遗憾的是,有时 Web 服务会在同一秒内多次发送具有相同 ID 的消息。它是一个外部服务,所以我无法控制它。
现在的问题是,消息来得如此之快,以至于数据库在下一条消息进入控制器之前没有保存消息。因此,检查 ID 是否已存在失败,并尝试再次保存相同的消息。这会导致异常,因为我在 ID 列上有一个唯一标识符。
处理此问题的最佳策略是什么?为此使用队列不是一个好的解决方案,因为消息是时间关键的,队列甚至更慢,它会导致队列内的消息堵塞/拥塞。
任何想法或帮助都非常感谢!谢谢!
您可以向数据库发送INSERT IGNORE
请求
INSERT IGNORE INTO messages (...) VALUES (...)
或
INSERT INTO messages (...) VALUES (...) ON DUPLICATE KEY UPDATE id=id.
您可以尝试重复更新。这是我过去用来解决此类问题的一种方式。不确定这是否是完美的解决方案,但绝对是一种选择。我假设你正在使用mysql。
https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html