12个版本 (重大更改)

0.12.0 2023年10月12日
0.11.0 2022年10月11日
0.10.0 2022年2月24日

#9 in #发布

Apache-2.0

29KB
609

Google Cloud Pub/Sub客户端

Crates.io license build

Google Cloud Pub/Sub客户端库,用Rust编写。目前支持发布、拉取和确认,但不支持创建主题或订阅等管理任务。

消息可以是原始的发布/拉取,或者如果负载是JSON数据,则可以通过SerdeSerde JSON序列化为/反序列化为领域消息(结构体或枚举)。原始的RawPulledMessage和“类型化”的PulledMessage都公开了元数据,如消息ID、确认ID、属性等。

除了直接的反序列化外,还可能首先转换拉取的JSON值,然后再将其反序列化为领域消息,这允许通常调整JSON结构以及模式演变。

用法

通常我们想使用领域消息

#[derive(Debug, Serialize, Deserialize)]
struct Message {
    text: String,
}

要发布Message,我们需要派生Serialize,要拉取它,我们需要派生Deserialize

首先创建一个PubSubClient,提供服务账户密钥文件的路径以及在访问令牌过期前刷新访问令牌的持续时间

let pub_sub_client = PubSubClient::new(
    "secrets/cryptic-hawk-336616-e228f9680cbc.json",
    Duration::from_secs(30),
)?;

可能会出错,例如,如果服务账户密钥文件不存在或格式不正确,因此返回一个Result

然后我们调用publish来使用给定的TOPIC_ID发布一些messages,如果一切顺利,则返回消息ID;我们在此处和以下不使用排序键或请求超时以简化

let messages = vec!["Hello", "from pub-sub-client"]
    .iter()
    .map(|s| s.to_string())
    .map(|text| Message { text })
    .collect::<Vec<_>>();
let message_ids = pub_sub_client
    .publish(TOPIC_ID, messages, None, None)
    .await?;
let message_ids = message_ids.join(", ");
println!("Published messages with IDs: {message_ids}");

接下来我们调用pull来从给定的SUBSCRIPTION_ID获取最多给定的42条消息

let pulled_messages = pub_sub_client
    .pull::<Message>(SUBSCRIPTION_ID, 42, None)
    .await?;

当然,通过HTTP进行的拉取可能会失败,因此我们返回另一个Result

最后我们处理被拉取的消息;为了简单起见,这里只处理成功的路径,即反序列化成功的场景。

for pulled_message in pulled_messages {
    match pulled_message.message {
        Ok(m) => println!("Pulled message with text \"{}\"", m.text),
        Err(e) => eprintln!("ERROR: {e}"),
    }

    pub_sub_client
        .acknowledge(SUBSCRIPTION_ID, vec![&pulled_message.ack_id], None)
        .await?;
    println!("Acknowledged message with ID {}", pulled_message.id);
}

对于成功反序列化的消息,我们调用从信封中获取的确认ID的 acknowledge

贡献策略

我们欢迎从GitHub拉取请求的原作者提交贡献。请随任何拉取请求一起声明,该贡献是您的原创作品,并且您将作品许可给项目,按照项目的开源许可证。无论您是否明确声明,通过拉取请求、电子邮件或其他方式提交任何受版权保护的材料,您即同意在项目的开源许可证下许可该材料,并保证您有合法权利这样做。

许可证

此代码是开源软件,根据Apache 2.0 许可证许可。

依赖项

~8–25MB
~376K SLoC