C ++中Google Pub / Sub的消费者示例

时间:2019-05-22 15:13:09

标签: c++ grpc google-cloud-pubsub

我正在尝试使用Google Pub / Sub,并且需要将其集成到C ++代码库中。

由于C ++中没有Google Pub/Sub的本机支持,因此我通过gRPC使用它。因此,我已经通过pubsub.grpc.pb.h生成了相应的pubsub.grpc.pb.ccpubsub.pb.hpubsub.pb.ccprotoc文件。

问题部分:由于缺少文档,所以在C ++中举个例子非常有帮助。我找到了example的发布者部分,但没有找到订阅者部分。我试图深入研究其他语言生成的代码和示例,但是出现了很多问题。订户部分有什么例子吗?还是有人已经有这种经验?

2 个答案:

答案 0 :(得分:2)

就像在发出发布请求一样,您可以发出StreamingPull条消息请求。请注意,这只是概念上的简单证明,实际上,您可能希望使此代码更健壮;例如创建多个流,使消息处理发生在线程池上,实现某种流控制等……

#include <iostream>
#include <memory>

#include <grpc++/grpc++.h>

#include "google/pubsub/v1/pubsub.grpc.pb.h"

auto main() -> int {
    using grpc::ClientContext;
    using grpc::ClientReaderWriter;
    using google::pubsub::v1::Subscriber;
    using google::pubsub::v1::StreamingPullRequest;
    using google::pubsub::v1::StreamingPullResponse;

    auto creds = grpc::GoogleDefaultCredentials();
    auto stub = std::make_unique<Subscriber::Stub>(
        grpc::CreateChannel("pubsub.googleapis.com", creds));

    // Open up the stream.
    ClientContext context;
    std::unique_ptr<ClientReaderWriter<
        StreamingPullRequest, StreamingPullResponse>> stream(
            stub->StreamingPull(&context));

    // Send initial message.
    StreamingPullRequest request;
    request.set_subscription(
        "projects/pubsub-cpp-api-1504713535863/subscriptions/testing");
    request.set_stream_ack_deadline_seconds(10);
    stream->Write(request);

    // Receive messages.
    StreamingPullResponse response;
    while (stream->Read(&response)) {
      // Ack messages.
      StreamingPullRequest ack_request;
      for (const auto &message : response.received_messages()) {
        ack_request.add_ack_ids(message.ack_id());
      }
      stream->Write(ack_request);
    }
}

这是最新的Cloud Pub / Sub API,也是当前推荐的从服务中提取消息的方式;对于期望高吞吐量和低延迟的用户而言尤其如此。当前,尚无用于C ++的客户端库,但是在GitHub上有一个开放的issue。其他语言(例如Java)的现有客户端库已经使用此API,因此您可以在自己的C ++代码中复制其功能。

对于更简单的用例,您还可以使用较旧的Pull API,该API发出许多独立的消息请求。请注意,为了获得高吞吐量和低延迟,您很可能应该制作许多同时进行的异步RPC:请参阅gRPC documentation

#include <iostream>
#include <memory>

#include <grpc++/grpc++.h>

#include "google/pubsub/v1/pubsub.grpc.pb.h"

auto main() -> int {
    using grpc::ClientContext;
    using google::pubsub::v1::Subscriber;
    using google::pubsub::v1::PullRequest;
    using google::pubsub::v1::PullResponse;

    auto creds = grpc::GoogleDefaultCredentials();
    auto stub = std::make_unique<Subscriber::Stub>(
        grpc::CreateChannel("pubsub.googleapis.com", creds));

    PullRequest request;
    request.set_subscription(
        "projects/pubsub-cpp-api-1504713535863/subscriptions/testing");
    request.set_max_messages(50);
    request.set_return_immediately(false);

    PullResponse response;
    ClientContext ctx;

    auto status = stub->Pull(&ctx, request, &response);
    if (!status.ok()) {
        // ...
    }

    // Do something with "response".
}

作为最后的选择,您可以使用Push订阅,这只需要您在客户端上实现HTTP端点。但是,通常不建议这样做,除非您从多个订阅中散布,或者在客户端无法发出传出请求的情况下。

答案 1 :(得分:0)

有一个名为pubsuber的c ++库,用于访问google pubsub。 有关更多信息,请查看here