我正在尝试使用Google Pub / Sub,并且需要将其集成到C ++代码库中。
由于C ++中没有Google Pub/Sub
的本机支持,因此我通过gRPC
使用它。因此,我已经通过pubsub.grpc.pb.h
生成了相应的pubsub.grpc.pb.cc
,pubsub.pb.h
,pubsub.pb.cc
和protoc
文件。
问题部分:由于缺少文档,所以在C ++中举个例子非常有帮助。我找到了example的发布者部分,但没有找到订阅者部分。我试图深入研究其他语言生成的代码和示例,但是出现了很多问题。订户部分有什么例子吗?还是有人已经有这种经验?
答案 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。