标签: distributed

分布式系统中的消息排序

我想构建一个分布式系统,其中我有分布在许多服务器上的“线程”(具有自己 ID 的消息集合,而不是系统进程)。这些线程必须具有两个关键属性:

  1. 线程中的每条消息都必须有一个订单号,以反映它基于时间在线程中的位置。例如,通过说“thread1/message10”,我可以在线程 #1 中找到消息 #10
  2. 一旦新消息被添加到线程中,系统必须能够为其分配一个订单号,该订单号对于所有服务器上的所有线程实例都是一致的,并且该编号绝不能更改。

我想知道是否有任何已知的解决方案、库或算法可以帮助我实现第二个选项,因为现在我认为这是一个大问题,因为由于许多因素,不同的服务器可以在不同的时间收到相同的消息,这可能会影响它订单号。

只是为了概述我目前对一个问题的想法,说我有 3 个服务器,我的分布式线程已经包含 5 条消息,每个服务器向它自己的线程和其余两个发送一条新消息。

  • 幼稚的订购。每个服务器都认为它自己的消息编号是 6,而来自其他服务器的其余两条消息将根据网络延迟和许多其他随机因素在到达时获得它们的编号,因此服务器之间的订单号不一致。这立即是不可接受的。

  • 基于 UTC 时间戳的排序。当每个线程收到一条新消息时,我假设 10 条前面的消息已经具有正确的订单号,提取它们的时间戳并通过在最近 10 个时间戳的列表中找到它的时间戳位置来确定新消息的订单号。我猜这可能有效,但它确实需要可以分配某些消息的订单号,然后在某些时候进行更改,这是不可接受的。另外,当传入的消息数量很大时,我不确定这是否会正常工作。

感谢所有的帮助。

messaging distributed system

4
推荐指数
1
解决办法
4833
查看次数

是否可以更改正在运行的 Elixir 节点的名称

我想动态更改梁实例的节点名称。

该用例位于 VM 集群中,我希望启动过程查找 IP 信息,然后从中选择一个名称。

node()
# => :nonode@nohost

# Lookup ip and change name

node()
# => :myapp@x.x.x.x
Run Code Online (Sandbox Code Playgroud)

erlang distributed elixir

4
推荐指数
1
解决办法
1719
查看次数

新手术语中的顺序一致性?

顺序一致性

任何执行的结果都是一样的,就好像所有处理器的操作都是按某种顺序执行的,每个处理器的操作都按照其程序指定的顺序出现在这个序列中。

我是分布式系统的新手,在这种情况下执行是什么意思,请以简单的方式解释这个定义?

distributed consistency distributed-transactions

4
推荐指数
1
解决办法
1396
查看次数

Raft 如何线性化?

我对分布式系统还很陌生,想知道 Raft 共识算法是如何线性化的。Raft 通过仲裁提交日志条目。当领导者 Raft 提交时,这意味着超过一半的参与者拥有复制的日志。但可能有一部分参与者没有最新日志,或者他们有日志但没有收到提交这些日志的指示。

或者 Raft 的读取线性化是否需要读取法定人数?

distributed consensus raft

4
推荐指数
1
解决办法
1113
查看次数

聊天期间以及用户再次登录时,Messenger 如何保持消息的顺序?

我在采访中被问到这个问题,但无法回答。

\n

当两条消息并发时,FB Messenger 如何对用户端的消息进行排序,以避免聊天期间以及用户再次访问 Messenger 时显示顺序出现差异。我认为我们可以为每条消息存储一个时间戳,这是服务器接收消息的时间。但是,这并不能确保客户端消息的正确排序。

\n

假设服务器时间戳无法确定消息的确切顺序,如下所示:

\n
    \n
  1. User-1 向 User-2 的服务器发送消息 M1。
  2. \n
  3. 服务器在 T1 接收 M1。
  4. \n
  5. 同时,User-2向User-1的服务器发送消息M2。
  6. \n
  7. 服务器在 T2 接收消息 M2,使得 T2 > T1。
  8. \n
  9. 服务器将消息 M1 发送到 User-2,将 M2 发送到 User-1。
  10. \n
  11. 因此,用户 1 将首先看到 M1,然后是 M2,而用户 2 将首先看到 M2,然后是 M1。
  12. \n
\n

我读到解决这个问题,我们可以使用矢量时钟,但无法理解如何在聊天期间以及用户再次登录时为不同用户保留消息顺序

\n

在上述场景中,用户 1 将看到 M1,然后是 M2,而用户 2 将看到 M2,然后是 M1。现在,如果每个用户还为其发送给每个客户端的每条消息(分别)生成序列号或时间戳。然后在上面的场景中,user1 将发送序列 <1 (user1 seq), 0(user2 seq) > 的消息 M1,而 user2 将发送序列 <0 (user1 seq), …

distributed distributed-computing distributed-system sequencing vector-clock

4
推荐指数
1
解决办法
2453
查看次数

更改SVN存储库

我从SVN服务器A检出了一个项目,但我需要将我的更改提交回服务器B - 两个服务器上的存储库具有相同的结构.我怎么能用Tortoise SVN做到这一点?

谢谢,唐

svn distributed

3
推荐指数
1
解决办法
111
查看次数

阻止操作和ZeroMQ

我正在设计一个分布式系统,其中单线程服务器进程执行CPU密集型操作.这些操作由ZeroMQ网络消息触发.

如果单线程进程正在执行CPU密集型工作,那么I/O(ZeroMQ套接字)是否会阻塞?

谢谢!

io networking distributed system zeromq

3
推荐指数
1
解决办法
2904
查看次数

更新时从服务器到客户端的RMI通知

我正在写一个假的运送应用程序.客户端发送产品,服务器保留所有发送的产品.

现在服务器 - 因为它只是虚拟的 - 每分钟更新产品的状态(SEND - > ACCEPTED - > SHIPPED - > RECEIVED),现在我希望服务器在更新状态时更新相应的客户端.

我讨论的大多数RMI信息只谈到客户端 - >服务器..但我需要我的服务器为我的客户端调用这个...

希望你们能帮忙!

java distributed client-server rmi

3
推荐指数
1
解决办法
9358
查看次数

Erlang负载均衡器

负载均衡器必须知道所有节点.客户端将与负载均衡器连接,然后负载均衡器将每个任务分配给节点.

如果客户端总是访问相同(单个)负载均衡器,怎么会没有单点故障?您不能拥有两个负载均衡器,否则客户端将如何知道要连接哪个负载均衡器?

是否接受了对于某些设计部分,您无法避免单点故障?

erlang distributed

3
推荐指数
1
解决办法
2280
查看次数

REST在分布式Web应用程序中的用途是什么

我正在学习REST API,我无法理解如何在分布式Web应用程序中使用REST?这是我见过的唯一参考.但是我仍然无法了解用于分布式计算的REST.先感谢您.

rest distributed

3
推荐指数
1
解决办法
4194
查看次数