我正在使用 Laravel 构建一个实时聊天应用程序,并希望使用 GridDB 作为我的数据库,因为它在处理时间序列数据方面具有高性能。由于 GridDB 没有官方的 PHP 客户端,因此我使用 Python 中的中间件 API 来设置自定义集成,以便与 GridDB 进行通信。我的 Laravel 应用程序通过 HTTP 请求与此中间件交互。
在我的聊天应用程序中,每条消息都需要一个唯一的 ID。在像 MySQL 这样的传统关系数据库中,我会使用自动递增整数作为主键。由于 GridDB 本身不支持自动递增 ID,因此我需要一种可靠的方法来为聊天消息生成唯一 ID,以处理高并发性,因为多个用户可能会同时发送消息。
我尝试将当前时间戳与随机数组合:
$messageId = time() . mt_rand(1000, 9999);
这减少了碰撞的机会,但并非万无一失,尤其是在高负载下。
我尝试通过查询最大现有ID并递增它来模拟自动递增:
$maxId = $this->getMaxMessageIdFromGridDB();
$messageId = $maxId + 1;
但是,这种方法在并发环境中并不安全,并且可能导致竞争条件。
使用 GridDB 的 TIMESTAMP 亚秒级精度的行键是否是唯一 ID 的可行选择?
使用 GridDB 的亚秒级精度的 TIMESTAMP 行键对于唯一 ID 来说是一个可行的选择吗?
不。仍然存在碰撞风险。
虽然您可以构建某种序列生成器,但您可能想看看 uniqid()。这仍然不完全安全。如果您计划大规模运行此程序,您可能需要添加主机和/或客户端枚举。
根据您打算运行此程序的位置,您可能需要设置一个熵收集守护进程。