< 返回版块

LacneQin 发表于 2019-12-24 00:10

Tags: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发布,具备异步/等待支持和Tokio 0.2兼容性

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

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

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版本更加简单:

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博客查看详细内容。

异步/等待WIP Discord API库:thatcord

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

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

[dependencies]
thatcord = { git = "https://github.com/Admicos/thatcord" }

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


From 日报小组 @Lance

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

评论区

写评论
fifc 2019-12-24 03:09

异步/等待,好久才反应过来

1 共 1 条评论, 1 页