我很好奇在分布式和并发环境中生成唯一序列号的约束和权衡.
想象一下:我有一个系统,它所做的就是每次提出时都会返回一个唯一的序列号.这是这种系统的理想规范(约束):
显然,这是一个理想化的规范,并非所有约束都可以完全满足.参见CAP定理.但是,我很想听听您对各种限制因素的分析.我们将留下什么类型的问题以及我们将使用什么算法来解决剩余的问题.例如,如果我们摆脱了计数器约束,那么问题就变得容易了:因为允许间隙,我们可以对数值范围进行分区并将它们映射到不同的机器上.
欢迎任何参考(论文,书籍,代码).我还想保留一份现有软件清单(开源与否).
软件:
counter guid distributed-computing sequence concurrent-programming
我正在开始我的最后一年计算机科学项目,我正在努力弄清楚我的第一步.有关更多详细信息,您可以转到项目页面.
背景:因为我在分布式系统方面经验很少,所以基本上我应该如何面对这样的挑战.我想出的是系统应该如下工作:
客户端发送一个文件或一组包含要处理的代码的文件.该代码将实现由我编写的分布式算法接口,即特定类.服务器将从类中创建一个对象.该对象将负责运行算法.服务器将结果返回给客户端.(我实际上后来读到了RMI并发现它非常相似).
发送文件是基本的 - 常见的网络I/O. 真正的问题是对象创建并在运行时将其用作预定义接口.
问题:
寻找一些分布式系统java技术我遇到过RMI,TRMI,LINDA,CORBA,JINI等等.RMI听起来最吸引人,因为它与我收集的解决方案非常相似,但它也很老.
如果你发现我的逻辑有些错误,请纠正它.
如果您有关于该主题的更多提示,您认为应该讨论,请随时与我联系.
我正在寻找一个在C++分布式数字运算应用程序中使用的框架.
设置如下:
有一个主节点将问题域划分为小的独立任务.任务分配给具有不同功能的工作节点(例如,CPU类型/ GPU启用).工作节点在可用时动态添加到计算网格中.也可能发生工作节点死亡,而没有说再见.
我正在寻找一个快速的C/C++框架来完成这个设置.
总结一下,我的主要要求是:
我们需要建立一个系统,其中多个进程在同一个数据集上工作.我们的想法是拥有一组可以被我们的工作进程(异步)拉出的元素(即没有重复的值).这些进程可能分布在多个服务器上,因此我们需要一个分布式解决方案.
目前,我们正在考虑的模式是使用Redis来保存一个包含工作数据的集合.每个进程都应连接到该集,并从中弹出一个值.随机功能spop对我们来说实际上是一个加分,因为我们需要随机访问集合中的元素.必须从我们的主PostgreSQL数据库填充数据.
就像我说的,我们还有一个可供查询的PostgreSQL数据库,进程在请求元素时可以访问.但是,我们不知道是否在重载下可能成为瓶颈.我们确实希望在这个子系统上进行繁重的 - 非常繁重的并发访问(想想数百甚至数千个进程).
如果它与此有任何关联,我们使用Python rQ来处理异步任务(作业和工作者).
编辑:就大小而言,元素可能不会很大 - 顶部大小应该在500-1000字节左右.它们基本上是URL,所以除非发生奇怪的事情,否则它们应该远低于这个大小.元素的数量将取决于并发进程的数量,因此大约10-50 K元素可能是一个很好的球场.请记住,这更像是一个临时区域,因此重点应放在速度上而不是尺寸上.
总之,我的问题是:
在使用多个进程时,Redis是否为共享访问设置了一个好主意?是否有任何数据可以让我们知道该解决方案将如何扩展?如果是这样,你能提供任何指示或建议吗?
填充共享数据时,什么是一个好的更新策略?
非常感谢你!
在阅读zeromq指南时,我遇到了客户端代码,它在循环中发送100k请求,然后在第二个循环中接收回复.
#include "../include/mdp.h"
#include <time.h>
int main (int argc, char *argv [])
{
int verbose = (argc > 1 && streq (argv [1], "-v"));
mdp_client_t *session = mdp_client_new ("tcp://localhost:5555", verbose);
int count;
for (count = 0; count < 100000; count++) {
zmsg_t *request = zmsg_new ();
zmsg_pushstr (request, "Hello world");
mdp_client_send (session, "echo", &request);
}
printf("sent all\n");
for (count = 0; count < 100000; count++) {
zmsg_t *reply = mdp_client_recv (session,NULL,NULL);
if (reply)
zmsg_destroy (&reply);
else
break; // Interrupted by …Run Code Online (Sandbox Code Playgroud) TLDR; 在消费者即时创建的主题交换和队列的上下文中,当没有消费者消费该消息时,如何重新传递消息/生产者被通知?
我有以下组件:
我目前只有一个RabbitMQ主题交换.
routing_key = file_category.现在 - 这个工作正常,但它仍然有一个重大问题.目前,如果发布者发送的消息带有没有绑定使用者的路由密钥,则该消息将丢失.这是因为即使消费者创建的队列是持久的,一旦消费者断开连接,它就会被销毁,因为它对这个消费者是唯一的.
消费者代码(python):
channel.exchange_declare(exchange=exchange_name, type='topic', durable=True)
result = channel.queue_declare(exclusive = True, durable=True)
queue_name = result.method.queue
topics = [ "pictures.*", "videos.trending" ]
for topic in topics:
channel.queue_bind(exchange=exchange_name, queue=queue_name, routing_key=topic)
channel.basic_consume(my_handler, queue=queue_name)
channel.start_consuming()
Run Code Online (Sandbox Code Playgroud)
在我的用例中,在这种情况下丢失消息是不可接受的.
但是,如果通知生产者没有消费者收到消息(在这种情况下它可以稍后重新发送),则"丢失"消息变得可以接受.我发现强制性字段可能有所帮助,因为AMQP的规范规定:
如果消息无法路由到队列,此标志告诉服务器如何做出反应.如果设置了此标志,则服务器将返回带有Return方法的unroutable消息.
这确实有效 - 在制片人中,我能够注册ReturnListener:
rabbitMq.confirmSelect();
rabbitMq.addReturnListener( (int replyCode, String replyText, String exchange, String routingKey, …Run Code Online (Sandbox Code Playgroud) python java distributed-computing rabbitmq rabbitmq-exchange
我有一个带有10个微服务的微服务架构,每个微服务都提供一个客户端.在由microService团队管理/控制的客户端内部,我们只接收参数并将它们传递给通用的http调用程序,它接收端点和N个参数,然后进行调用.所有的microService都使用http和web api(我猜技术并不重要).
对于我而言,成为微服务团队提供客户端没有意义,应该是消费者的责任,如果他们想要创建一些抽象或直接调用它是他们的问题,而不是微服务问题.我看到Web API的方式就是合同.所以我认为我们应该在microService端删除所有客户端(将责任传递给消费者),并在消费者一侧创建一个使用通用调用者到达端点的服务层.
下图显示了红线定义边界的所有组件,谁负责:
另一方面是因为我们可能有N个消费者,他们都在重复客户端的代码.如果microService提供了一个客户端,我们就有一个独特的/集中的位置来控制它.
哪种方法是正确的?客户是微服务还是消费者的责任?
这是一个内部产品.
山姆·纽曼(Sam Newman)在他的《建筑微服务》一书中指出
服务之间过多耦合的弊端远不如代码重复所引起的问题
我只是不了解服务之间的共享代码是多么邪恶。作者是否表示如果需要共享库,则服务边界本身设计不良,还是真的意味着在出现常见业务逻辑依赖性时我应该复制代码?我看不出能解决什么。
假设我有两个服务共有的实体共享库。两个服务的公共域对象可能有异味,但是另一个服务是用于调整那些实体状态的GUI,另一个是用于其他服务轮询其状态的接口。相同的域,不同的功能。
现在,如果共享知识发生了变化,无论通用代码是外部依赖项还是跨服务重复,我都必须重建和部署这两个服务。通常,这取决于业务逻辑的同一条,涉及两种服务的所有情况。在这种情况下,我只会看到重复代码的危害,从而降低了系统的凝聚力。
当然,在共享库的情况下,与共享知识区分开可能会引起头痛,但是即使这样,也可以通过继承,组合和抽象的巧妙使用来解决。
那么,山姆所说的代码复制比通过共享库进行过多耦合要好吗?
architecture interface distributed-computing shared-libraries microservices
我正在使用旧线程发布新代码,试图解决同样的问题.什么构成安全的泡菜?这个?
sock.py
from socket import socket
from socket import AF_INET
from socket import SOCK_STREAM
from socket import gethostbyname
from socket import gethostname
class SocketServer:
def __init__(self, port):
self.sock = socket(AF_INET, SOCK_STREAM)
self.port = port
def listen(self, data):
self.sock.bind(("127.0.0.1", self.port))
self.sock.listen(len(data))
while data:
s = self.sock.accept()[0]
siz, dat = data.pop()
s.send(siz)
s.send(dat)
s.close()
class Socket:
def __init__(self, host, port):
self.sock = socket(AF_INET, SOCK_STREAM)
self.sock.connect((host, port))
def recv(self, size):
return self.sock.recv(size)
Run Code Online (Sandbox Code Playgroud)
pack.py
#http://stackoverflow.com/questions/6234586/we-need-to-pickle-any-sort-of-callable
from marshal import dumps as marshal_dumps
from pickle …Run Code Online (Sandbox Code Playgroud) 只有很少的序列化器可用,如,
org.apache.kafka.common.serialization.StringSerializer
org.apache.kafka.common.serialization.StringSerializer
Run Code Online (Sandbox Code Playgroud)
我们如何创建自己的自定义序列化程序?
java ×3
python ×2
apache-kafka ×1
architecture ×1
asynchronous ×1
c ×1
c++ ×1
counter ×1
guid ×1
hpc ×1
interface ×1
pickle ×1
postgresql ×1
queue ×1
rabbitmq ×1
redis ×1
sequence ×1
sockets ×1
zeromq ×1