- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题涉及 etcd
特定的东西,但我认为这个问题通常与 gRPC
的工作更相关。我正在尝试为一些 key 创建 etcd
Watch
,因为文档很少我看了一下 Nokia implementation根据我的需要调整代码很容易,我想出了第一个运行良好的版本,创建 WatchCreateRequest
,并在 key 更新时触发回调。到目前为止,一切都很好。然后我尝试添加多个键来观看。惨败! ClientAsyncReaderWriter
在这种情况下读取/写入失败。现在回答问题。
如果我类有以下成员
Watch::Stub watchStub;
CompletionQueue completionQueue;
ClientContext context;
std::unique_ptr<ClientAsyncReaderWriter<WatchRequest, WatchResponse>> stream;
WatchResponse reply;
并且我想支持添加到我的类(class)的多个 Watches
,我想我必须为每个 watch 保留多个变量,而不是作为类(class)成员。首先,我想,WatchResponse 回复
应该是每个 Watch
一个。我不太确定 stream
,我应该为每个 Watch
保留一个吗?我几乎可以肯定 context
可以重用于所有 Watches
并且 100% 确定 stub
和 completionQueue
可以可重复用于所有 Watches
。所以问题是我的猜测对吗?什么是线程安全?没有找到任何文档来描述哪些对象可以安全地从多线程使用以及我必须在哪里同步访问。任何文档链接 (not this one) 将不胜感激!
在将成员拆分为单个 Watch
属性之前测试代码(没有正常关机,我知道)
using namespace grpc;
class Watcher
{
public:
using Callback = std::function<void(const std::string&, const std::string&)>;
Watcher(std::shared_ptr<Channel> channel) : watchStub(channel)
{
stream = watchStub.AsyncWatch(&context, &completionQueue, (void*) "create");
eventPoller = std::thread([this]() { WaitForEvent(); });
}
void AddWatch(const std::string& key, Callback callback)
{
AddWatch(key, callback, false);
}
void AddWatches(const std::string& key, Callback callback)
{
AddWatch(key, callback, true);
}
private:
void AddWatch(const std::string& key, Callback callback, bool isRecursive)
{
auto insertionResult = callbacks.emplace(key, callback);
if (!insertionResult.second) {
throw std::runtime_error("Event handle already exist.");
}
WatchRequest watch_req;
WatchCreateRequest watch_create_req;
watch_create_req.set_key(key);
if (isRecursive) {
watch_create_req.set_range_end(key + "\xFF");
}
watch_req.mutable_create_request()->CopyFrom(watch_create_req);
stream->Write(watch_req, (void*) insertionResult.first->first.c_str());
stream->Read(&reply, (void*) insertionResult.first->first.c_str());
}
void WaitForEvent()
{
void* got_tag;
bool ok = false;
while (completionQueue.Next(&got_tag, &ok)) {
if (ok == false) {
break;
}
if (got_tag == (void*) "writes done") {
// Signal shutdown
}
else if (got_tag == (void*) "create") {
}
else if (got_tag == (void*) "write") {
}
else {
auto tag = std::string(reinterpret_cast<char*>(got_tag));
auto findIt = callbacks.find(tag);
if (findIt == callbacks.end()) {
throw std::runtime_error("Key \"" + tag + "\"not found");
}
if (reply.events_size()) {
ParseResponse(findIt->second);
}
stream->Read(&reply, got_tag);
}
}
}
void ParseResponse(Callback& callback)
{
for (int i = 0; i < reply.events_size(); ++i) {
auto event = reply.events(i);
auto key = event.kv().key();
callback(event.kv().key(), event.kv().value());
}
}
Watch::Stub watchStub;
CompletionQueue completionQueue;
ClientContext context;
std::unique_ptr<ClientAsyncReaderWriter<WatchRequest, WatchResponse>> stream;
WatchResponse reply;
std::unordered_map<std::string, Callback> callbacks;
std::thread eventPoller;
};
最佳答案
很抱歉,我不太确定这里的 Watch
设计是否合适。我不太清楚是否要为每个 Watch
创建一个 gRPC 调用。
无论如何,每个 gRPC 调用都会有自己的 ClientContext
、ClientAsyncReaderWriter
。但是 stub
和 CompletionQueue
不是每次调用的事情。
据我所知,没有找到线程安全类的中心位置。您可能需要阅读 API 文档以获得正确的预期。
当我写 async server load reporting service 的时候,我自己添加同步的唯一地方是 CompletionQueue
,这样我就不会在 cq 关闭时将新标签加入队列。
关于c++ - gRPC 和 etcd 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51394558/
我正在使用此命令启动 etcd(v3.3.15) 服务: systemctl start etcd 这是我的 etcd 系统配置: [Unit] Description=Etcd Server Aft
我尝试为数据中心设置 coreos etcd 集群。 我最多可以在集群中为其设置多少个节点? 我和添加更多节点是否有助于提高性能? 我没有从官网上找到图。它只提到 9 就可以。 最佳答案 据我所知,我
跨多个数据中心使用 etcd 是否安全?因为它将 etcd 端口暴露给公共(public)互联网。 在这种情况下我是否必须使用客户端证书或 etcd 有某种身份验证? 最佳答案 是的,但是您需要解决两
我试图理解 etcd 上的“原子”更新是什么。 当我想到“原子”时,我认为有一个“之前”和一个“之后”(没有期间,如果更新失败,它仍然是“之前”)。 这是一个例子: curl -s -XPUT htt
我是 etcd 的新手还有一些关于日志复制的困惑点: 例如,leader 发送 {term:2,index:3} 然后发送 {term:2,index:4},大多数人也按顺序响应。但由于网络延迟,le
使用 -w json 或 --hex 标志以 json(base64) 或十六进制格式提取 etcd 数据很简单 ETCDCTL_API=3 etcdctl get /registry/secrets
我正在使用 github.com/coreos/etcd/client 与 etcd 云通信,有时我会收到 401 错误“请求索引中的事件已过时并已清除”,在服务器页面上有一个解释为什么它发生了如何解
我正在尝试使用 Containerd 在 CentOS 8 上设置 3 个节点的 Kubernets 1.18。按照 Stacked control plane 和 etcd 节点 ( https:/
我们的 kubernetes 集群最近因 etcd“超出数据库大小”而崩溃。 我们通过“简单”的 etcd 集群端点碎片整理 (see here) 成功地恢复了一切。 不幸的是,一切还不完美。特别是
我在golang中遇到以下错误 # go.etcd.io/etcd/clientv3/balancer/picker
我尝试在 kubeadm 中使用 coredns 安装 cilium 库贝:1.12.3 纤毛:1.3.0 我收到此错误: Readiness probe failed: KVStore: Fail
当我想通过在 Rancher UI 中选择 etcd、Controle Plane 和 Worker 来加入节点时,我收到了这个错误: 集群必须至少有一个 etcd 平面主机:无法连接到以下 etcd
ETCD-raft笔记 0. 引言 该篇博客基于etcd v3.5.7版本,首先会简单介绍etcd/raft对Raft选举部分的算法优化,然后通过源码分析etcd/raft的选举实现。
我正在使用 ubuntu 14.04 并且我正在配置 etcd 以与 calico 一起使用,但该服务不起作用。 这是我的 etcd.conf 文件: # vim:set ft=upstart ts=
我正在尝试在 Ubuntu 机器上设置 3 节点 etcd 集群作为网络的 docker 数据存储。我使用 etcd docker 镜像成功创建了 etcd 集群。现在,当我尝试复制它时,这些步骤在一
据我所知,etcd使用 Raft 作为共识和领导者选择算法来维护一个领导者,该领导者负责保持 etcd 的集合。节点与 etcd 中的数据更改同步簇。除此之外,这允许 etcd从集群中的节点故障中恢复
etcd:增加30%的写入性能 本文最终的解决方式很简单,就是将现有卷升级为支持更高IOPS的卷,但解决问题的过程值得推荐。 译自: etcd: getting 30% more wr
正在尝试使用 coreos/jetcd 用于更新 etcd 中的 haproxy 设置来自Java代码。 我想要实现的是: 删除单个主机的所有端点 添加给定主机的更新数据 我想通过前缀删除所有键,并将
我在 AWS 中有一个 k8s 集群,看起来部分正常,但实际上不会进行部署。查看组件的健康状况时,etcd 显示为不健康。这似乎是 etcd 端点被查询为 http 与 https 的问题: kube
我正在尝试使用etcd作为后端部署CoreDNS。我已经了解了etcd和CoreDNS的大多数配置,但是我正尝试为开发人员提供文档,说明如何将记录推送到etcd中以供CoreDNS使用。 阅读所有et
我是一名优秀的程序员,十分优秀!