我正在看这个video关于 Akka.net,演讲者表示,先读后读并不能产生一致的结果,因为事件的顺序在网络级别是不可预测的。演示者在该视频中谈到的架构如下:
- 一个负载均衡器
- 多个网络服务器。负载均衡器确定要访问哪个服务器。
- 一台数据库服务器 (SQL Server)。
我很困惑为什么使用单个数据库无法获得一致的结果?如果在写入数据之前加锁,这不会给您带来一致的结果吗?
最佳答案
所以我猜您正在谈论 Aaron 在这段视频中大约 10 分钟描述的场景。场景如下:
- 用户正在点击网站上的内容,我们将发出异步请求来记录点击次数。
- 他所描述的场景中不明显的部分是,我们不会等待之前的请求完成,然后再发送更多请求来捕获用户的点击(想象一个单页应用程序,其中点击不发生)不会导致服务器完全刷新页面)。我们希望捕获所有点击。
- 我们在服务器上有一些逻辑,“如果用户连续点击这 3 个内容,请做出一些很酷的 react ......”
- 我们通过将我们刚刚到达的点击事件写入数据库来检查网络服务器上的条件(“用户是否连续单击了这 3 个东西?”),然后读取以查看它们是否生成了流只需三件事就能做出我们很酷的 react 。
问题是:每个记录点击的请求都可能发送到不同的网络服务器,而我们不会等待前一个请求完成,然后再发送更多记录点击的请求。因此,我们无法保证写入第一个事件的请求在写入第二个或第三个事件之前已完成。
例如,第一个请求可能会因为网络故障而延迟(甚至失败!),因此第二个请求可能会先到达我们的 SQL Server!因此,当它读取已发生的事件流时,它无法意识到已发送(但尚未完成)记录第一个事件发生的请求。
我认为他想要表达的观点是,面对多个客户端(在本例中为 Web 服务器)同时写入数据库,你不能指望“我先发送了该数据,所以它会被记录下来”第一的”。无论您使用的是 DataStax Enterprise、Cassandra、SQL Server、Oracle 还是其他任何软件,这一点都适用。希望有帮助!
关于mysql - 为什么在正确的方法之后读取并不能产生一致的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44013405/