【发布时间】:2021-04-18 11:36:36
【问题描述】:
我正在尝试实现一个类似于 AWS 或 Azure 队列的 PubSub 客户端,但是,我遇到了 gcloud cpp sdk 的问题。
更新:删除了不必要的细节。
首先,提供的example 不能开箱即用——我必须在session.cancel() 之前休眠,否则无法确认消息。是否有可靠的方法等到 ack() 操作完成并检查其状态?至少我想确保服务器收到我的请求。
此外,c++ API 似乎只提供了一个不适合我的用例的异步方法。
我需要实现以下接口,该接口通过依赖注入插入到更大的系统中。该系统在其他云上的生产中工作,因此我无法更改架构。只需要实现接口即可。
template<typename TItem>
class Queue{
public:
/*!
* Dequeues message from the queue
* Returns true on success
*/
virtual bool Dequeue( TItem & item) = 0;
/*!
* Discards(deletes) the item with from the cloud queue.
*/
virtual void Discard(const TReceipt & receipt) = 0;
};
队列的实际实现将提供一个序列化器,该序列化器将 TItem 序列化为 JSON 并返回。
AWS 和 Azure SDK 为每个出队的消息提供一个收据,以便我以后可以丢弃它。 pubsub SDK 的收据是 AckHandler 对象,它绑定到会话。
一个明显错误的解决方案是保持会话打开并在 lambda 中等待另一个 condition_variable,直到下一次调用 Dequeue 方法。但是,这看起来像是一个快速而肮脏的解决方案。 使用 Pub/Sub 实现此功能的正确方法是什么?
【问题讨论】:
标签: c++11 google-cloud-platform google-cloud-pubsub