#google-cloud #pub-sub #client #derive #pub-sub-client

pub-sub-client-derive

Google Cloud Pub/Sub客户端库

5个不稳定版本

0.11.0 2022年10月11日
0.10.0 2022年2月24日
0.9.2 2022年2月10日
0.9.1 2022年1月29日
0.9.0 2022年1月29日

#109 in #pub-sub

每月 30 次下载

Apache-2.0

7KB

Google Cloud Pub/Sub客户端

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

消息可以是原始的或序列化的,如果有效载荷是JSON数据,则通过SerdeSerde JSON序列化为/反序列化为领域消息(结构体或枚举)。原始的ReceivedMessages和"类型化"的PulledMessages都公开了元数据,如消息ID、确认ID、属性等。

除了直接的反序列化之外,还可以在反序列化之前首先转换拉取的JSON值,这允许一般地调整JSON结构以及模式演进。

用法

通常我们想要使用领域消息

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

为了发布Message,我们需要为它派生SerializePublishedMessage,而为了拉取它,我们需要为它派生Deserialize

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

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

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

然后我们调用publish来发布一些消息,使用给定的TOPIC_ID,如果一切顺利,则返回消息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许可证授权。

依赖项

~1.5MB
~35K SLoC