前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Rust日报】 2019-12-23 Trust-DNS 0.18发布,具备异步/等待支持和Tokio 0.2兼容性。

【Rust日报】 2019-12-23 Trust-DNS 0.18发布,具备异步/等待支持和Tokio 0.2兼容性。

作者头像
MikeLoveRust
发布2019-12-25 17:49:30
6650
发布2019-12-25 17:49:30
举报
文章被收录于专栏:Rust语言学习交流

MongoDb团队发布正式Alpha版本的客户端

这是一个完全重写的项目,旧的客户端已经被放弃。

MongoDB在Rust方面拥有长时间的研究。早在2013年,两名实习生就针对Rust 0.7的数据库编写了原型Rust驱动程序,但是由于Rust语言发展迅速,并且当时进rust行了重大更改,因此这套代码最终被淘汰。

Rust驱动程序支持3.6以上的所有MongoDB服务器版本,并且需要Rust 1.39或更高版本。它使用rustlscrate以及SCRAM-SHA-1和SCRAM-SHA-256身份验证实现本机TLS,完全支持独立实例、副本集和分片群集 。

该驱动程序支持连接到MongoDB Atlas和本地部署。通过bson crate驱动程序支持使用serde对从数据库写入的文档进行序列化和反序列化。

更多详细信息和使用方法参见https://www.mongodb.com/blog/post/announcing-the-official-mongodb-rust-driver

Trust-DNS 0.18发布,具备async/await支持和Tokio 0.2兼容性

async/await一直是Rust中一个期待已久的功能。对于这个语言来说,是一个巨大的“革命家”。传统上,低级异步编程始终意味着构建状态机,并抽象化围绕它们的系统。尽管Futures库通过为我们提供针对常见场景的预定义状态机确实起到了很大的帮助作用,但Rust中的Futures的原始版本没有什么不同。

从某些代码中可以最容易地看出这是更符合人体工程学的示例,这是先前版本的TrustS-DNS(HTTPS请求处理程序)中的示例:

代码语言:javascript
复制
pub fn h2_handler<T, I>(
    handler: Arc<Mutex<T>>,
    io: I,
    src_addr: SocketAddr,
    dns_hostname: Arc<String>,
) -> impl Future<Item = (), Error = ()>
where
    T: RequestHandler,
    I: AsyncRead + AsyncWrite,
{
    // Start the HTTP/2.0 connection handshake
    server::handshake(io)
        .map_err(|e| warn!("h2 handshake error: {}", e))
        .and_then(move |h2| {
            let dns_hostname = dns_hostname.clone();
            // Accept all inbound HTTP/2.0 streams sent over the
            // connection.
            h2.map_err(|e| warn!("h2 failed to receive message: {}", e))
                .for_each(move |(request, respond)| {
                    debug!("Received request: {:#?}", request);
                    let dns_hostname = dns_hostname.clone();
                    let handler = handler.clone();
                    let responder = HttpsResponseHandle(Arc::new(Mutex::new(respond)));

                    https_server::message_from(dns_hostname, request)
                        .map_err(|e| warn!("h2 failed to receive message: {}", e))
                        .and_then(|bytes| {
                            BinDecodable::from_bytes(&bytes)
                                .map_err(|e| warn!("could not decode message: {}", e))
                        })
                        .and_then(move |message| {
                            debug!("received message: {:?}", message);

                            server_future::handle_request(
                                message,
                                src_addr,
                                handler.clone(),
                                responder,
                            )
                        })
                })
        })
        .map_err(|_| warn!("error in h2 handler"))
}

上述示例说明了如何将较早的Future组合器一起使用,但是这使得编写一些复杂的代码成为可能。此async fn版本更加简单:

代码语言:javascript
复制
pub async fn h2_handler<T, I>(
    handler: Arc<Mutex<T>>,
    io: I,
    src_addr: SocketAddr,
    dns_hostname: Arc<String>,
) where
    T: RequestHandler,
    I: AsyncRead + AsyncWrite + Unpin,
{
    let dns_hostname = dns_hostname.clone();

    // Start the HTTP/2.0 connection handshake
    let mut h2 = match server::handshake(io).await {
        Ok(h2) => h2,
        Err(err) => {
            warn!("handshake error from {}: {}", src_addr, err);
            return;
        }
    };

    // Accept all inbound HTTP/2.0 streams sent over the
    // connection.
    while let Some(next_request) = h2.accept().await {
        let (request, respond) = match next_request {
            Ok(next_request) => next_request,
            Err(err) => {
                warn!("error accepting request {}: {}", src_addr, err);
                return;
            }
        };

        debug!("Received request: {:#?}", request);
        let dns_hostname = dns_hostname.clone();
        let handler = handler.clone();
        let responder = HttpsResponseHandle(Arc::new(Mutex::new(respond)));

        match https_server::message_from(dns_hostname, request).await {
            Ok(bytes) => handle_request(bytes, src_addr, handler, responder).await,
            Err(err) => warn!("error while handling request from {}: {}", src_addr, err),
        };

        // we'll continue handling requests from here.
    }
}

此代码更直接,容易阅读,也会更讨巧。这是异步/等待的最大优势,您可以以更简单的方式编写代码。

更多细节前往GitHub博客查看详细内容。

async/await WIP Discord API库:thatcord

这个工程是以为技术极客所创造,它仍然不及正式版本软件的功能完善,因此除非您愿意做出贡献,否则请不要尝试使用它。

thatcord的原型Rust Discord库支持tokio 0.2,futures 0.3和异步/等待。由于过于强调原型,因为它目前只能接收,不能发送。并且仅支同时持两个进程。关于文献资料,目前也十分缺乏。但是,这个examples/目录对于该库的当前完整功能应该足够。

代码语言:javascript
复制
[dependencies]
thatcord = { git = "https://github.com/Admicos/thatcord" }

更多细节及工程克隆请访问GitHub


From 日报小组 @Lance

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDb团队发布正式Alpha版本的客户端
  • Trust-DNS 0.18发布,具备async/await支持和Tokio 0.2兼容性
  • async/await一直是Rust中一个期待已久的功能。对于这个语言来说,是一个巨大的“革命家”。传统上,低级异步编程始终意味着构建状态机,并抽象化围绕它们的系统。尽管Futures库通过为我们提供针对常见场景的预定义状态机确实起到了很大的帮助作用,但Rust中的Futures的原始版本没有什么不同。
  • async/await WIP Discord API库:thatcord
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档