我正在尝试使用需要查询hbase后端的actix构建一个rust web框架。我们选择使用thrift代码生成器生成包含此文件的API。然而,我们在弄清楚如何将连接传递到我们的web层查询函数时遇到了一些困难。官方的actix方法是使用提取应用程序状态的提取器,在本例中是hbase连接。更具体地说,我们能够创建thbaseservicesyncclient类型的对象,这是我们希望传递的应用程序数据,它保持与hbase的开放连接,并允许我们进行查询。
官方的方法是为每个正在运行的线程克隆这些数据。我们遇到的第一个问题是,这种类型没有实现 Clone
特质。我们能够实现自己的目标 Clone
功能,只是实现了它也没有实现 DerefMut
特质。这有点困难,由于上面链接的api中的函数定义,因此无法避免。通常的方法是用一个 Mutex
. 我们对此进行了试验,但效果很差。争用太高了,我们不能为所有线程使用一个全局连接。
我们研究了在rust中如何处理其他流行的数据库连接。我们意识到 thread_pool
通常使用,其中保留一个活动连接池,管理器跟踪活动/不活动的连接,并在需要时进行更多的旋转。我们找到了这个 r2d2
板条箱,声称提供了一个通用的连接池生 rust 。不幸的是,这里没有节俭的支持,我们尝试实现非常简单的池管理器,类似于mysql的变体。结果很不令人满意。根据一些简单的例子,吞吐量并不是我们所需要的,很多时间都浪费在了池管理器上 flamegraph
分析。
有没有更明显的方法来实现这个目标,我们在这里错过了?我想知道是否有人经历过类似的问题,并能提供一些内部的什么是最好的方式去做这件事。非常感谢。
暂无答案!
目前还没有任何答案,快来回答吧!