Datastax如何为Cassandra实现其异步API驱动程序?

时间:2017-10-14 22:02:37

标签: asynchronous cassandra datastax nonblocking datastax-java-driver

我试图说服同事使用Session #cuteAsync的好处。

但是,由于我们正在使用Scala中的驱动程序,因此将同步调用Session#execute包含在Future中将非常容易,并且将在异步调用中对其进行转换。这将是一个改进,因为它将为我们提供避免阻塞当前线程的机会(在我们的情况下,这将代表阻塞处理http请求的线程,对可以同时处理的请求数量产生巨大影响)

我认为,如果实现异步驱动程序所需的工作将它包装在Future中,那么就不会存在像ReactiveMongo这样的实现,而是来自Datastax的Cassandra Async Api。

所以,

  1. 使用async api有什么好处?
  2. 如何在Datastax驱动程序中实现异步api,以及库和操作系统功能所依赖的内容?
  3. 除了异步网络调用之外还有哪些问题需要解决? (我的意思是,实现异步驱动程序必须不仅仅是使用java nio)

1 个答案:

答案 0 :(得分:0)

  

如何在Datastax驱动程序中实现异步api,以及库和操作系统功能所依赖的内容?

基于Netty网络框架的Datastax java驱动程序。 Netty本身基于Event Driven模型。此外,对于某些操作系统,Netty提供本机传输以提高性能,例如适用于Linux的epoll

  

使用async api有什么好处?

我不是Scala专家,但我知道基于Threads模型的Scala Future(执行上下文)。这意味着您需要向另一个线程提交请求以异步执行请求。对于IO任务,您只需要请求另一个系统并等待来自此系统的响应。如果您有大量请求,则池中的所有线程都将忙,但不会执行任何有用的操作。线程是一种相当昂贵的资源,在同一物理资源中拥有数千个线程可能是个问题。线程适用于并行计算任务,但不适用于IO任务。

另一方面基于事件驱动模型(Netty)的Datastax java驱动程序。这意味着每个请求都将在event loop队列中提交。对于事件循环的每次迭代,Netty将定义请求的状态,并将执行与此请求关联的处理程序。 这种方法避免了线程的内存使用开销,并允许您同时执行数千个IO请求。但在这种情况下,您应该在另一个线程中定义慢速或阻塞请求回调,以避免阻塞事件循环。