为什么 read after right 方法不能产生一致的结果?
Why does read after right method not produce consistent results?
我正在看关于 Akka.net 的 video 并且演讲者说右后阅读不会产生一致的结果,因为事件的顺序在网络级别不可预测。主讲人在这个视频中谈到的架构如下:
- 一个负载均衡器
- 多个网络服务器。负载平衡器决定命中哪个服务器。
- 一台数据库服务器(SQL 服务器)。
我很困惑为什么单个数据库无法获得一致的结果?如果在写入数据之前加锁,那不会给您带来一致的结果吗?
所以我猜你说的是亚伦在这个视频中大约 10 分钟描述的场景。场景如下:
- 用户正在点击网站上的内容,我们正在触发异步请求以记录点击。
- 他所描述的场景中不明显的部分是,我们没有等待之前的请求完成,然后再发送更多请求来捕获用户的点击(想象一个单击不会导致服务器页面完全刷新的页面应用程序)。我们想捕获所有点击。
- 我们在服务器上有一些逻辑说,"If the user clicks these 3 things in a row, do some cool reaction..."
- 我们检查 Web 服务器 ("Has the user clicked these 3 things in a row?") 上的情况,方法是将我们刚刚到达的点击事件写入我们的数据库,然后读取以查看它们是否已生成点击执行我们的 3 件事的流很酷的反应。
问题在于:每个记录点击的请求都可能会发送到不同的网络服务器,而我们不会等待前一个请求完成后再发送更多请求来记录点击。所以我们无法保证在我们写入第二个或第三个等之前写入第一个事件的请求已经完成。
例如,由于网络故障,第一个请求可能会延迟(甚至失败!),因此第二个请求可以先到达我们的 SQL 服务器!因此,当它去读取已发生的事件流时,它可能不知道已发送(但尚未完成)请求以记录第一个事件的发生。
我认为他想表达的意思是,面对多个客户端(在本例中为 Web 服务器)同时写入数据库,您不能指望,"I sent that first so it will be recorded first"。无论您使用的是 DataStax Enterprise、Cassandra、SQL Server、Oracle 还是其他任何东西,这都适用。希望对您有所帮助!
我正在看关于 Akka.net 的 video 并且演讲者说右后阅读不会产生一致的结果,因为事件的顺序在网络级别不可预测。主讲人在这个视频中谈到的架构如下:
- 一个负载均衡器
- 多个网络服务器。负载平衡器决定命中哪个服务器。
- 一台数据库服务器(SQL 服务器)。
我很困惑为什么单个数据库无法获得一致的结果?如果在写入数据之前加锁,那不会给您带来一致的结果吗?
所以我猜你说的是亚伦在这个视频中大约 10 分钟描述的场景。场景如下:
- 用户正在点击网站上的内容,我们正在触发异步请求以记录点击。
- 他所描述的场景中不明显的部分是,我们没有等待之前的请求完成,然后再发送更多请求来捕获用户的点击(想象一个单击不会导致服务器页面完全刷新的页面应用程序)。我们想捕获所有点击。
- 我们在服务器上有一些逻辑说,"If the user clicks these 3 things in a row, do some cool reaction..."
- 我们检查 Web 服务器 ("Has the user clicked these 3 things in a row?") 上的情况,方法是将我们刚刚到达的点击事件写入我们的数据库,然后读取以查看它们是否已生成点击执行我们的 3 件事的流很酷的反应。
问题在于:每个记录点击的请求都可能会发送到不同的网络服务器,而我们不会等待前一个请求完成后再发送更多请求来记录点击。所以我们无法保证在我们写入第二个或第三个等之前写入第一个事件的请求已经完成。
例如,由于网络故障,第一个请求可能会延迟(甚至失败!),因此第二个请求可以先到达我们的 SQL 服务器!因此,当它去读取已发生的事件流时,它可能不知道已发送(但尚未完成)请求以记录第一个事件的发生。
我认为他想表达的意思是,面对多个客户端(在本例中为 Web 服务器)同时写入数据库,您不能指望,"I sent that first so it will be recorded first"。无论您使用的是 DataStax Enterprise、Cassandra、SQL Server、Oracle 还是其他任何东西,这都适用。希望对您有所帮助!