标签: distributed-system

锁定服务器场 (asp.net)

我想知道是否有任何方法可以使用分布式服务器(如 MySQL Cluster)对部署在多台服务器上的 asp.net Web 应用程序执行“锁定”。

例如,以更新帐户余额的经典示例为例。不应有两个请求同时更新相同的帐户余额。例如:

会员 1 账户余额为 100。

  • 请求 A 访问服务器 1 给成员 1 的余额增加 100
  • 请求 B 访问服务器 2 给成员 1 的余额增加 50

因此请求 A 将余额从 100 更新为 200 并保存。
请求 B 将余额更新为 150,并保存。

这些都完全同时发生,因此丢失了信息,因为最终结果应该是 250。

一个锁定如何才能使请求 B 必须等到请求 A 完成,直到它取回余额。如果它是单个进程,这可以通过应用程序范围的锁来实现。但是,由于有多个独立的进程,这对服务器 1 不起作用,它没有被锁定,服务器 2 也没有

任何想法或最佳实践如何做到这一点?

c# asp.net locking distributed-computing distributed-system

5
推荐指数
1
解决办法
1988
查看次数

从哪里开始学习分布式系统编程?

我是 CSS 学位的应届毕业生,我从未有机会参加有关分布式系统的课程,但我逐渐对这个主题感兴趣。我很想一头扎进这个主题,希望能开始我作为该领域软件开发人员的职业生涯。我参加了操作系统课程,了解多线程编程,以及分布式系统概念的基本知识,但这与我对主题的了解差不多,而这根本不接近。

有没有人知道一个适合拥有 CSS 学位的人开始学习该主题的好地方?

我真的需要分布式系统方面的强大背景才能获得入门级工作,还是您认为有公司愿意雇用具有强大编程技能但不一定对分布式系统有深入了解的人?

cloud network-programming distributed-system

5
推荐指数
0
解决办法
8988
查看次数

分布式认证

我想实现一个特定的架构,将我的 rest API 与 Web 服务器分离,该 Web 服务器将用作不可知的模板引擎,例如 DustJS。我的后端休息 API 将使用服务堆栈构建。

我喜欢服务堆栈和 NodeJS 的主要方面是它们都提供了一种身份验证方式,但我只需要一种中央方式来访问凭证,以授予对 API 调用的访问权限以及限制我的视图中的某些内容。

我想开发的应用程序是一个基于订阅的约会网站,所以这给我带来了一些问题。涉及的参数是角色、组、身份验证和授权。在服务堆栈上实现很容易,但我主要对前端如何访问该信息感到困惑。

我将如何实现前端检索凭据一次并且不必继续进行 API 调用来检查数据库或缓存以查看它是否已检出的场景?我是否需要实施不同的方法来处理希望保持登录状态的客户端,或者通常仅通过设置时间戳值就可以解决这个问题?

谢谢大家的时间。

rest distributed-system node.js servicestack

5
推荐指数
1
解决办法
580
查看次数

分布式系统中客户端之间的websocket通信

我正在尝试构建即时通讯应用程序。客户不仅会发送消息,还经常发送音频。我决定使用 websocket 连接与客户端进行通信。它速度很快并且允许发送二进制数据。

主要思想是接收来自client1 的消息并通知client2。但事情是这样的。我的应用程序将在 GAE 上运行。如果client1的套接字在server1上打开并且client2的套接字在server2上打开会怎样。该服务器不了解彼此的客户端。

我有一个想法如何解决它,但我确信这是一种糟糕的方式。我将在服务器之间使用某种通信(例如 JMS 或在服务器之间打开另一个 websocket 连接,现在并不重要)。
但这肯定会导致灾难。我什至无法想象这些服务器相互通信的频率。对于每条消息,server1应通知server2server2应通知client2但当serverN发挥作用时,事情会变得更糟。

我认为此方法有效的另一种方式是 Firebase。但它将消息大小限制为 4KB。所以我无法通过它发送音频。作为解决方案,我可以通知客户有关新音频的信息,然后他前往我的服务器获取该音频。

希望我清楚地解释了问题。有谁知道如何解决它?或者也许还有其他方法来构建此类应用程序?

sockets google-app-engine chat instant-messaging distributed-system

5
推荐指数
1
解决办法
5331
查看次数

节点如何知道哪些节点已经看到集群当前状态?

我正在阅读 akka 文档,并在理解他们实现Gossip 的方式时遇到了一些麻烦。(文档在这里)。让我困惑的部分(强调我的):

\n\n
\n

周期性地,默认是每1秒,每个节点选择另一个随机节点来发起一轮八卦。如果少于\xc2\xbd 的\n 节点位于已见集合中(已经看到新状态),则\n 集群闲话3 次,而不是每秒一次。这种调整后的八卦间隔是在状态改变后的早期传播阶段加速收敛过程的一种方法。

\n
\n\n

因此,如果八卦轮处于开始阶段(少于 \xc2\xbd 节点已看到当前状态),则来自已见集合的节点开始每秒发送 3 个八卦而不是一个。但如果八卦聚合发生了,他们怎么知道这一点(他们仍然每秒发送 3 次八卦)。或者,也许收敛就像任何其他“集群事件”一样在整个集群中传播?

\n

java scala distributed-system akka gossip

5
推荐指数
1
解决办法
267
查看次数

奇数如何解决分布式系统中的脑裂?

分布式系统建议使用奇数个 Master 节点,例如 3 个 Master 节点或 5 个 Master 节点,以避免脑裂问题。

但是它是如何解决问题的呢?

如果有2个节点(A和B),1个主持人,如果A和B告诉主持人“我是大师”,那么就会发生脑裂。主持人无法决定谁是大师。

如果有 3 个节点(A、B 和 C),那么如果有 2 个节点说 Master 是 A,那么 Moderator 可以决定 A 是 Master。

但是如果A死了,那么Moderator必须从B和C中选择一个Master,如果B和C告诉Moderator“我是Master”呢?脑裂再次出现。

linux distributed-computing cluster-computing distributed-system

5
推荐指数
1
解决办法
1251
查看次数

分布式环境中的布隆过滤器

我有一个由几个应用程序实例组成的系统,用 Java 编写。对它们的请求是负载平衡的以实现高可用性。每一秒,这个“集群”都会收到数百个小数据块(每个数据块由几个简单的字符串组成),存储在数据库中,保存几天然后丢弃。除了存储这些数据外,主要要求是快速确定给定的值是否存储在数据库中。一个适当索引和分区的数据库表似乎适合这个问题,并且它的工作很好,至少现在是这样。

问题是,大约 80% 的搜索值未找到,因为它们不在数据库中。因此,我想加快速度,使搜索速度更快,资源占用更少。布隆过滤器将是显而易见的选择,如果不是因为不同的应用程序实例接收不同部分的数据,并且如果每个应用程序实例的布隆过滤器中只有一部分数据,那么这些布隆过滤器就没有用了。

您对如何解决此问题有任何建议/想法吗?

java search distributed-system bloom-filter

5
推荐指数
1
解决办法
952
查看次数

分布式系统中 REST API 的幂等性和竞争条件

什么可能是实现幂等性并处理竞争条件的替代解决方案。

例如。考虑将客户添加到记录系统的请求。客户详细信息将以电子邮件 ID 作为关键属性。并假设有 API 来创建客户。

考虑一种情况,由于来自客户端的重复请求,在时间 T1,两个请求可能会登陆服务器以创建相同电子邮件 ID 的客户,例如“xyz@abc.com”。

请求 1,时间 T1,电子邮件 ID“xyz@abc.com” 请求 2,时间 T1,电子邮件 ID“xyz@abc.com”

我正在寻找分布式系统如何在 REST API 调用中处理幂等性和竞争条件的方法?我知道有不同的方法,例如,

  • 数据库约束
  • 分布式锁

DB Constraint on column email id,很容易解决这个问题。也可以选择分布式锁或使用 no-sql 方法在将记录存储之前检查缓存中的电子邮件 ID。

考虑到分布式特性,还有哪些其他可扩展的方法?

为什么要避免约束是,它对索引、性能和规模都有影响。

rest distributed-computing distributed-system race-condition idempotent

5
推荐指数
0
解决办法
428
查看次数

跨多个微服务的 2PC 分布式事务?

我阅读了一些关于2 Phase Commit/XA 分布式事务以及 JTA 如何支持它的信息。似乎有许多资源管理器 - RM(例如 RDBMS 或 JMS),以及一个管理跨多个 RM 的全局事务的TransactionManager (TM)实例。 TM <-> RM 通讯

我知道最好使用Saga 模式,但想想还是很有趣的:

  1. 2PC/XA 分布式事务是否提供了仅从一个应用程序和一个 TM 与许多 RM 进行事务处理的可能性?
  2. 如果没有 - 如何在许多微服务之间使用2PC/XA 分布式事务来提供使用 2PC 的能力,如果每个微服务只能访问自己的数据库?我很高兴看到一个例子
  3. 我们是否需要使用TransactionManager服务作为单独的微服务来提供许多微服务之间的 2PC?

UPD: 在 JTA 世界 TransactionManager 中,不提供用于跨微服务管理事务的REST API。LIXA 提供了这种能力。除答案外还附有示例的文章:)

java 2phase-commit distributed-system distributed-transactions microservices

5
推荐指数
1
解决办法
265
查看次数

ENV在分布式Node系统中的正确使用

我正在构建一个相对复杂的分布式节点系统。假设有两个进程(节点应用程序),A 和 B。它们在不同的项目中定义。

此外,还有一些定制的节点模块,在 A 和 B 中使用。我们称它们为 M 和 N。此外,M 使用 N。

我应该如何正确处理环境变量?

我想我应该为两个主要进程(A 和 B)定义 .env,从那里处理所有 ENV 变量,然后简单地将所需的 env 变量从那里传递到 M 和 N。这样,M 和 N(以及其他内部模块) 将接收它们自己的 ENV 变量作为创建时的参数传递。

这种方法是否正确?

environment-variables distributed-system node.js

5
推荐指数
1
解决办法
124
查看次数