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.
这个问题可能也适用于其他库,但以 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.