如何在 Tornado 中为具有高度可扩展基础架构的应用程序进行 MySQL 数据库调用,从而进行大量数据库查询?
How to make MySQL Database calls in Tornado for an application with highly scalable infrastructure which makes a high number of database queries?
那么对于具有高度可扩展基础设施的高性能应用程序,在 Tornado 中进行数据库调用的哪种方法会更好,从而进行大量数据库查询?
方法 1 : 所以我遇到了异步数据库 drivers/clients 像 TorMySQL, Tornado-Mysql, asynctorndb 等可以执行异步数据库调用.
方法二 : 使用通用的MySQLdb或mysqlclient (by PyMySQL) 驱动程序,并进行数据库调用以分离后端服务并使用nginx对调用进行负载平衡。
类似于他们在其中一个小组中提到的原始 Friendfeed 人员所做的事情,
原作者之一布雷特·泰勒 (Bret Taylor) 写道:
groups.google.com/group/python-tornado/browse_thread/thread/9a08f5f08cdab108
We experimented with different async DB approaches, but settled on
synchronous at FriendFeed because generally if our DB queries were
backlogging our requests, our backends couldn't scale to the load
anyway. Things that were slow enough were abstracted to separate
backend services which we fetched asynchronously via the async HTTP
module.
方法 2 的其他支持 links 以更好地理解我想说的是:
- Whosebug Answer
方法 3:通过使用线程和 IOLoop 并使用通用同步库。
支持示例link解释我的意思,
- Tornado wiki 所说的,https://github.com/tornadoweb/tornado/wiki/Threading-and-concurrency
Do it synchronously and block the IOLoop. This is most appropriate for
things like memcache and database queries that are under your control
and should always be fast. If it's not fast, make it fast by adding
the appropriate indexes to the database, etc.
另一个示例方法:
对于同步数据库(mysqldb),我们可以
执行器=ThreadPoolExecutor(4)
结果 = 产量 executor.submit(mysqldb_operation)
方法 4:只需使用像 MySQLdb 这样的同步驱动程序,并使用 nginx 启动足够的 Tornado 实例和负载平衡,使应用程序在更广泛的层面上保持异步,一些调用被阻止,但其他调用请求通过大量龙卷风实例使异步性质受益。
'Explanation' :
有关详细信息,请遵循此 link - www.jjinux.com/2009/12/python-asynchronous-networking-apis-and.html,其中表示:
They allow MySQL queries to block the entire process. However, they
compensate in two ways. They lean heavily on their asynchronous web
client wherever possible. They also make use of multiple Python
processes. Hence, if you're handling 500 simultaneous request, you
might use nginx to split them among 10 different Tornado Web
processes. Each process is handling 50 simultaneous requests. If one
of those requests needs to make a call to the database, only 50
(instead of 500) requests are blocked.
FriendFeed 使用了您所谓的"method 4":没有单独的后端服务;该进程刚刚在数据库调用期间被阻止。
通常最好使用完全异步的驱动程序 ("method 1")。但是,这意味着您不能使用像 SQLAlchemy 这样包装数据库操作的同步库。在这种情况下,您可能必须使用线程 ("method 3"),这几乎和 "method 2" 一样好(并且比 "method 2" 更容易)。
"method 4"的优点是简单。过去这足以推荐它,因为到处引入回调很乏味;随着协同程序的出现,方法 3 几乎同样简单,因此通常使用线程比阻塞进程更好。
那么对于具有高度可扩展基础设施的高性能应用程序,在 Tornado 中进行数据库调用的哪种方法会更好,从而进行大量数据库查询?
方法 1 : 所以我遇到了异步数据库 drivers/clients 像 TorMySQL, Tornado-Mysql, asynctorndb 等可以执行异步数据库调用.
方法二 : 使用通用的MySQLdb或mysqlclient (by PyMySQL) 驱动程序,并进行数据库调用以分离后端服务并使用nginx对调用进行负载平衡。 类似于他们在其中一个小组中提到的原始 Friendfeed 人员所做的事情,
原作者之一布雷特·泰勒 (Bret Taylor) 写道:
groups.google.com/group/python-tornado/browse_thread/thread/9a08f5f08cdab108
We experimented with different async DB approaches, but settled on synchronous at FriendFeed because generally if our DB queries were backlogging our requests, our backends couldn't scale to the load anyway. Things that were slow enough were abstracted to separate backend services which we fetched asynchronously via the async HTTP module.
方法 2 的其他支持 links 以更好地理解我想说的是:
- Whosebug Answer
方法 3:通过使用线程和 IOLoop 并使用通用同步库。
支持示例link解释我的意思,
- Tornado wiki 所说的,https://github.com/tornadoweb/tornado/wiki/Threading-and-concurrency
Do it synchronously and block the IOLoop. This is most appropriate for things like memcache and database queries that are under your control and should always be fast. If it's not fast, make it fast by adding the appropriate indexes to the database, etc.
另一个示例方法:
对于同步数据库(mysqldb),我们可以
执行器=ThreadPoolExecutor(4)
结果 = 产量 executor.submit(mysqldb_operation)
方法 4:只需使用像 MySQLdb 这样的同步驱动程序,并使用 nginx 启动足够的 Tornado 实例和负载平衡,使应用程序在更广泛的层面上保持异步,一些调用被阻止,但其他调用请求通过大量龙卷风实例使异步性质受益。
'Explanation' :
有关详细信息,请遵循此 link - www.jjinux.com/2009/12/python-asynchronous-networking-apis-and.html,其中表示:
They allow MySQL queries to block the entire process. However, they compensate in two ways. They lean heavily on their asynchronous web client wherever possible. They also make use of multiple Python processes. Hence, if you're handling 500 simultaneous request, you might use nginx to split them among 10 different Tornado Web processes. Each process is handling 50 simultaneous requests. If one of those requests needs to make a call to the database, only 50 (instead of 500) requests are blocked.
FriendFeed 使用了您所谓的"method 4":没有单独的后端服务;该进程刚刚在数据库调用期间被阻止。
通常最好使用完全异步的驱动程序 ("method 1")。但是,这意味着您不能使用像 SQLAlchemy 这样包装数据库操作的同步库。在这种情况下,您可能必须使用线程 ("method 3"),这几乎和 "method 2" 一样好(并且比 "method 2" 更容易)。
"method 4"的优点是简单。过去这足以推荐它,因为到处引入回调很乏味;随着协同程序的出现,方法 3 几乎同样简单,因此通常使用线程比阻塞进程更好。