我正试图找出一种在Docker swarm模式下在服务副本之间实现主动/被动故障转移的正确方法.
该服务将保持一个不会丢失的有价值的内存状态,这就是我需要多个副本的原因.副本将在内部实现Raft,因此只有在给定时刻处于活动状态("领导者")的副本才会接受来自客户端的请求.
(如果你不熟悉Raft:简单地说,它是一个分布式共识算法,它有助于实现主动/被动容错的复制群集.根据Raft,主动副本 - 领导者 - 将其数据的变化复制到被动副本 - 追随者.只有领导者接受客户的请求.如果领导者失败,则在追随者中选出新的领导者).
据我所知,Docker将保证指定数量的副本启动并运行,但它将以主动/主动方式平衡所有副本之间的传入请求.
如何告诉Docker仅将请求路由到活动副本,但仍保证所有副本都已启动?
一种选择是通过另一个NGINX容器路由所有请求,并在每次选出新的领导者时更新其规则.但这将是一个额外的跳跃,我想避免.
我也试图避免使用外部/重叠工具,consul或者kubernetes为了使解决方案尽可能简单.(HAProxy不是一个选项,因为我需要一个Linux/Windows便携式解决方案).所以目前我正在努力了解是否可以单独完成Docker swarm mode.
我遇到的另一种方法是从被动副本返回失败的健康检查.它与技巧kubernetes 根据这个答案,但我不知道它会与码头工人工作.群集管理器如何解释来自任务容器的失败健康检查?
我很感激任何想法.
编辑:从OP的评论,目标是 非阻塞后台任务,以便其余保持响应
说我有一个这样的功能:
void OnFrameSampleAcquired(VideoCaptureSample sample)
{
//Some code here
//Here I want to introduce an Asynchrnous process
ProcessAsynchronously(_latestImageBytes);
//some more code here
}
Run Code Online (Sandbox Code Playgroud)
在评论中,我想介绍一个对异步函数的调用。现在,我无法修改OnFrameSampleAcquired(意味着我无法使其“异步”)。我怎样才能做到这一点?
我在想
async void ProcessAsynchronously(byte[] image)
{
await Process1(image);
await Process2(image);
// ...
}
Run Code Online (Sandbox Code Playgroud)
要么 async Task ProcessAsynchronously(byte[] image)
其中ProcessX也声明为 async
这是一个好方法吗?
感谢您提供任何见解,因为我在异步处理方面的实践经验很少。