如何解决带有 Actix 的 Rust Thrift HBase 服务器
我正在尝试使用需要查询 HBase 后端的 Actix 构建 Rust Web 框架。我们选择使用 Thrift 代码生成器生成带有 this 文件的 API。然而,我们在弄清楚如何将连接传递给我们的 Web 层查询函数时遇到了一些麻烦。 Actix 的官方方法是使用 extractor 提取应用程序状态,在本例中为 HBase 连接。更具体地说,我们能够创建 THBaseServiceSyncClient 类型的对象,这是我们希望传递的应用程序数据,它保持与 HBase 的开放连接并允许我们进行查询。
官方方法是为每个正在运行的线程克隆这些数据。我们遇到的第一个问题是,这种类型没有实现 Clone
trait。我们能够实现我们自己的 Clone
函数,只是意识到它也没有实现 DerefMut
特性。这稍微困难一些,并且由于上面链接的 API 中的函数定义而无法规避。执行此操作的常用方法是用 Mutex
包装对象。我们已经对此进行了实验,但它的表现非常糟糕。竞争太激烈了,我们根本不可能有一个全局连接供所有线程使用。
我们研究了如何在 Rust 中处理其他流行的数据库连接。我们意识到通常使用 thread_pool
,其中保留活动连接池,管理器跟踪活动/死连接并在需要时启动更多。我们发现了 this r2d2
crate,它声称为 Rust 提供了一个通用的连接池。不幸的是,没有节俭支持,我们通过实现我们非常简单的池管理器进行了实验,类似于 mysql 变体 here。结果非常令人失望。根据一些简单的 flamegraph
分析,吞吐量几乎不是我们需要的,而且很多时间都浪费在池管理器上。
是否有一些更明显的方法可以实现我们在这里缺少的目标?我想知道是否有人遇到过类似的问题,并且可以提供一些有关执行此操作的最佳方法的内部信息。非常感谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。