同步与异步数据库访问

18

我想开发一个复杂的游戏,可能涉及到数千个函数和数据库调用。

我想知道是否真的有必要使用异步来执行数据库查询。这会让编码变得困难,并且我的所有函数都需要使用回调而不是简洁的return方法。这种方式正常吗?

考虑到 MySQL 数据库一次只能处理一个查询,那么使用异步对于编写这些调用是否真的更快呢?


一个MySQL数据库每次只能处理一个查询 - 每个连接。Mysql为每个连接生成新线程,至少与mysql服务器上的核心数一样多的连接应该可以提高性能。 - Andrey Sidorov
1
如果您还没有被异步编程的优点所说服,为什么要考虑使用Node.js呢?请确保您不是一个没有充分理由的粉丝,请观看视频http://www.youtube.ug/watch?v=bzkRVzciAZg。 - Mâtt Frëëman
5个回答

13

除非在最近的 Node.JS 中有了根本性的改变,否则您几乎被迫使用异步数据库访问来实现良好的扩展性,因为所有用户请求都将在单个线程上执行,如果同步等待数据库的响应速度缓慢,将会严重降低系统性能。如果一个用户执行的操作很慢,所有其他用户都必须等待它完成。

Node.JS 真正适合异步事件驱动流程,与其迂回工作相比,与它一起工作将获得更好的性能。


7
异步请求并不比同步请求更快,无论你如何操作它们,它们仍然会执行相同的任务。唯一改变的是你是否在请求上阻塞。
使用同步请求时,发出请求的方法会停止执行,等待请求返回后才会继续执行。但是使用异步请求时,无需等待请求完成,可以继续其他操作,请求完成后回调函数将被调用。
此外,当应用程序对数据库管理系统进行大量调用时,通常数据库是瓶颈,因此您可能需要考虑使用某种缓存来减少从数据库管理系统中的负载。

1

无论哪种方式,数据库引擎的速度+传输时间基本上都是相同的。问题在于异步调用不会阻塞调用者。因此,异步架构是任何需要对其他输入高度响应的“实时”系统的选择(例如游戏应始终对人类非常敏感)。


1
查询将在MySQL的数据库层面排队。如果您考虑使用Mongo DB存储数据,将会有更多选项。

1

像Nitzan一样,你必须知道“异步请求并不比同步请求更快,无论你如何做,它们仍然做着完全相同的事情。”

没有人谈论过,但如果有很多用户和很多请求,你有其他解决方案来限制数据库访问:

创建缓存文件

通过用户操作或CRON任务更新它们。

  • 用户信息
  • 用户警报
  • 用户操作
  • 用户库存 ...

存储的数据库进程

对于一些经常性的请求,你可以将它们存储在MySQL中。 这些将比用户请求执行得更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接