2014-12-07 73 views
0

我有一个龙卷风web应用程序,用于跟踪一些数据(它使用cassandra存储和cql进行查询)。它有两件事:cassandra中的多个异步查询

  1. 在一列中添加一条记录。
  2. 在少数列系列中增加一批计数器。

在下面的例子中,如果您查看Storage类的track方法,它会执行两个异步查询,第一个异步查询会执行成功或错误回调。在我的开发环境中,我看到两个异步查询都正确执行。这是否会产生问题(从第一天起,我将每秒获得5000次以上的点击率,因为我将把它整合到已有的应用程序中)。我曾用Apache Benchmark测试过并发请求,但没有看到任何问题。我只是想确定。还有更好的方式来处理这种情况,并会有任何性能影响?下面

例子:

class SomeClass(tornado.web.RequestHandler): 
    def collect_data(self): 
     return {} # has some data 

    def on_success(self): 
     # has logic here 
     self.finish() 

    def on_error(self): 
     # has logic here 
     self.finish() 

    @tornado.web.asynchronous 
    def get(self): 
     # some code here 
     Storage.track(self.collect_data(), self.onsuccess, self.onerror) 

class Storage(object): 
    @classmethod 
    def connect(cls): 
     cluster = Cluster() 
     cls._session = cluster.connect() 

    @classmethod 
    def track(cls, data, success_callback, error_callback): 
     if not hasattr(cls, '_session'): 
      cls.connect() 
     cls._session.execute_async(*insert query*).add_callbacks(success_callback, error_callback) 
     cls._session.execute_async(*some batch queries to increase counters*) 

回答

0

您可以了解有关性能和不同的图案here一些讨论。在这种情况下,你的方法似乎是合理的我想补充一点,使用准备好的语句是一个好主意,您可以在会话的整个生命周期中准备并保留这些语句。

这会不会对生产问题[...] [?]

这取决于很多东西,包括你的环境,部署尺寸,等你能做的最好的事情是基准