我在 AWS 上有一个基本结构,其中有一个 Aurora MySQL 集群和两台服务器,一个 WRITER (db.t2.medium) 和一个 READER (db.r5.large)。
我在 NodeJS 中有一个应用程序,它运行以下例程:
就代码而言,其结构如下(考虑到 db.writer 是在 WRITER 服务器上执行查询的 knex 实例,db.reader 是在 READER 服务器上执行的实例):
let theNewId = await db.writer.raw("INSERT INTO users (`name`,`email`) VALUES ('John Doe','[email protected]')").catch(err => { console.log(err)}).then(async R=>{
return await db.reader.raw("SELECT * FROM users WHERE `email`='[email protected]'").catch(err => { console.log(err)}).then( async result=>{
let theId = result[0].id;
await db.writer.raw(""INSERT INTO users_emails (`user_id`,`email`) VALUES ('"+theId+"','[email protected]')"");
return theId;
});
});
注意:我没有执行原始查询,我只是用它作为示例。
我在代码的所有类似功能中遇到的问题:即使阅读器在插入函数的结果内运行,也找不到当我检查时由 WRITER 正确插入的行。
是否可以进行任何类型的配置或最佳编程实践,以便在这种情况下不会发生这种异步情况?
为了完成这个问题:经过大量研究,我发现读取和写入实例之间存在异步,这迫使我在这些特定情况下使用相同的写入服务器来执行搜索。
今天遇到同样的问题,当您在插入后立即查询新添加的记录时,会发生这种情况,有可能您的查询发生在新记录从写入器数据库同步到读取器数据库之前,并导致了问题。
解决方案就像 Anibal 提到的那样,在同一个 writer 数据库上运行查询来执行此类任务。