Kotlin 协程:wrap cassandra 同步用法与翻译异步用法

Kotlin coroutines: wrap cassandra synchronous usage vs translate asynchronous usage

这个问题可能也适用于其他库,但以 Cassandra 为例来尝试确保我问的是一个可回答的问题:

使用 Kotlin,我可以使用 Cassandra 的异步方法,然后使用 ListenableFuture 集成包装它们, 我可以使用 Cassandra 的同步方法并将它们的用法包装为一种暂停方法和 launch/async。

我猜测更好的技术是使用库的现有异步方法,假设这样可以更容易地避免死锁并且速度更快,但我推测并且是协程的新手。

对于对协程更有经验的人来说,这是一个明显的答案吗?还是有特定的领域"it depends"?

这取决于您正在使用的库的内部细节以及您的 performance/scalability 目标:

  • 如果您的库是内部异步,那么始终建议通过其原生异步API 使用它。免责声明:我不知道 Cassandra 的内部结构(同步或异步)。
  • 如果您的库是内部 synchronous/blocking(大多数遗留库都是),那么这取决于:
    • 如果您的应用程序是 IO 绑定的(reads/writes 很多字节 to/from network/disk) 并且您正在针对吞吐量对其进行优化(最大化 大批量负载处理的字节数),那么,作为一个规则 拇指,你最好使用 synchronous/blocking APIs.
    • 如果您的应用程序受内存限制,并且您想将其扩展到更多 concurrent connections/requests,那么根据经验,您将 最好使用异步 APIs.