如何在Tornado中为具有高度可扩展的基础架构的应用程序进行MySQL数据库调用,从而产生大量的数据库查询?

时间:2016-01-14 20:57:58

标签: python mysql asynchronous tornado mysql-python

那么哪个是更好的方法在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)请求被阻止。

1 个答案:

答案 0 :(得分:4)

FriendFeed使用了你所说的"方法4":没有单独的后端服务;在数据库调用期间,该进程刚刚被阻止。

使用完全异步的驱动程序("方法1")通常是最好的。但是,这意味着您无法使用包装SQLAlchemy等数据库操作的同步库。在这种情况下,您可能必须使用线程("方法3和#34;),这几乎一样好(并且比#34;方法2和#34;更容易)。

"方法4"的优势这很容易。在过去,这足以推荐它,因为在所有地方引入回调是乏味的;随着协同程序3的出现几乎同样容易,因此通常使用线程比阻止进程更好。