那么哪个是更好的方法在Tornado中为高性能应用程序进行数据库调用,该应用程序具有高度可扩展的基础架构,从而产生大量数据库查询?
方法1 :所以我遇到了可以执行异步数据库调用的异步数据库驱动程序/客户端,如TorMySQL,Tornado-Mysql,asynctorndb等。
方法2 :使用通用和常见的MySQLdb或mysqlclient(通过PyMySQL)驱动程序,并使数据库调用分离后端服务并使用nginx对调用进行负载平衡。 与他们在其中一个小组中提到的原始Friendfeed家伙的做法类似,
原作者之一布雷特泰勒写道:
groups.google.com/group/python-tornado/browse_thread/thread/9a08f5f08cdab108
我们尝试了不同的异步数据库方法,但已经确定了 在FriendFeed同步,因为通常我们的数据库查询是 积压我们的请求,我们的后端无法扩展到负载 无论如何。足够缓慢的东西被抽象化以分开 我们通过异步HTTP异步获取的后端服务 模块。
方法2 的其他支持链接,以便更好地理解我想说的内容:
方法3 :通过使用线程和IOLoop并使用通用同步库。
支持示例链接来解释我的意思,
同步执行并阻止IOLoop。这是最合适的 像你所掌控的memcache和数据库查询之类的东西 而且应该永远快。如果它不快,可以通过添加来加快速度 适当的数据库索引等。
另一个示例方法:
对于同步数据库(mysqldb),我们可以
executor = ThreadPoolExecutor(4)
result = yield executor.submit(mysqldb_operation)
方法4 :只需使用像MySQLdb这样的同步驱动程序,并使用nginx启动足够的Tornado实例和负载平衡,使应用程序在更广泛的层次上保持异步,某些调用被阻止,但其他请求有利于异步性质通过大量的龙卷风实例。
'说明' :
详情请点击此链接 - www.jjinux.com/2009/12/python-asynchronous-networking-apis-and.html,其中说:
它们允许MySQL查询阻止整个过程。但是,他们 以两种方式弥补。他们非常依赖异步网络 客户尽可能。他们还使用了多个Python 流程。因此,如果您正在处理500个同时请求,那么您 可能会使用nginx将它们分成10个不同的Tornado Web 流程。每个进程处理50个并发请求。如果一个 这些请求需要调用数据库,只有50个 (而不是500)请求被阻止。
答案 0 :(得分:4)
FriendFeed使用了你所说的"方法4":没有单独的后端服务;在数据库调用期间,该进程刚刚被阻止。
使用完全异步的驱动程序("方法1")通常是最好的。但是,这意味着您无法使用包装SQLAlchemy等数据库操作的同步库。在这种情况下,您可能必须使用线程("方法3和#34;),这几乎一样好(并且比#34;方法2和#34;更容易)。
"方法4"的优势这很容易。在过去,这足以推荐它,因为在所有地方引入回调是乏味的;随着协同程序3的出现几乎同样容易,因此通常使用线程比阻止进程更好。