如果您设计一个易于横向扩展的分布式应用程序,或者您只想使用亚马逊,谷歌或微软的任何新"云计算"产品,那么您通常最终会使用一些典型的概念或组件:
现在,在设计和绘制使用这种模式的架构时,我可以使用任何常用的符号吗?甚至可以下载一些很酷的Visio模板?:)
它不一定是像UML这样的正式系统,但我认为如果有每个人都知道和理解的符号会很好,比如我们通常使用数据库或文档的形状.我认为不要将它与普通文件系统(本地或网络服务器/ SAN)或关系数据库等传统概念混淆是很重要的.
简单来说,我希望能够通过查看系统架构概述图得出有关应用程序可伸缩性或数据一致性问题的一些结论.
更新:非常感谢您的回答.我喜欢在传统符号上加上一个小"云符号"的想法.但是我打开这个帖子以防万一有人会找到特定的符号(可能在一本书中) - 或上传一些拉皮条Visio模板;)
我在使用 PHP 的 SoapClient 分布式 WSDL 文件(方案/其他定义在实际 WSDL 之外声明)时遇到问题。
这是我收到的错误消息:
SOAP-ERROR: Parsing WSDL: 'getSomeInfo' already defined.
Run Code Online (Sandbox Code Playgroud)
经过一番谷歌搜索后,这似乎是 PHP 内部的一个错误,因为其他人发现了完全相同的问题:http://bugs.php.net/bug.php ?id=45282
有任何错误修复吗?有什么解决方案可以解决这个错误吗?
我认为发布代码片段是没有意义的,因为仅使用 WSDL 调用 SoapClient ctor 是唯一失败的。
我们想构建一个媒体流服务器,并想知道选择硬件和软件时的策略.
我们的一些要求:
这里的情况与你们之前可能遇到的情况略有不同.专业系统管理员和开发人员的成本比在存储解决方案领域与硬件或软件供应商签订合同要便宜得多.我们扩展的方式是购买廉价的商品硬件,并且(可能)使用各种开源软件自行构建基础设施.
我们正在研究各种用于存储的分布式文件系统,例如MogileFS,GlusterFS,HDFS,看起来HDFS可能是领跑者.
如果你之前已经建立了类似的东西,请分享你的经验.
谢谢!
我为即将推出的分布式NoSQL数据库系统制作了一个内部分布式时间服务器(没有主服务器).只要分布式系统中2/3的时钟正确,它就应该处理Byzantium时钟和时钟偏移问题.
然而,我想看看其他人是如何实现这种模式的(对基于IEEE 1588的主/从模式实现不感兴趣) - 最好是一些已经在使用的开源代码 - 断言我已经正确实现了它因为很难为它编写单元测试.
有谁知道这样的开源实现?我们使用C++的编程语言,所以我更喜欢C/C++引用,但只要代码具有人类可读性,它可能就不那么重要了.
以下是我的实现到目前为止的代码(为简单起见,部分伪代码):
/*!
\brief Maximum allowed clock skew in milliseconds
\details A network node that has a clock skew greater than this value will be ignore
* and an error message will be logged
\note Maximum divergence (drift) between two clocks on the network nodes will be 3x this amount if we
* have a worst case Byzantium clock issue
*/
#define MAX_ALLOWED_CLOCK_SCEW_MS 333
/*!
\class CTimeServer
\brief Internal distributed time server
\details …Run Code Online (Sandbox Code Playgroud) 我正在研究什么基本上是一个高度可用的分布式消息传递系统。系统通过 HTTP 或 TCP 从某处接收消息,对其执行各种转换,然后将其发送到一个或多个目的地(也使用 TCP/HTTP)。
系统要求发送到给定目的地的所有消息都是有序的,因为有些消息建立在先前消息的内容之上。这限制了我们按顺序处理消息,每条消息大约需要 750 毫秒。因此,例如,如果有人每 250 毫秒向我们发送一条消息,我们将被迫将消息排在彼此后面。这最终会在高负载下在消息处理中引入无法容忍的延迟,因为每条消息在轮到它之前可能必须等待数百条其他消息被处理。
为了解决这个问题,我希望能够在不违反我们按顺序发送它们的要求的情况下并行化我们的消息处理。
我们可以轻松地横向扩展我们的处理。缺失的部分是一种确保即使消息被乱序处理的方法,它们也会被“重新排序”并按照接收顺序发送到目的地。我正在努力寻找实现这一目标的最佳方式。
Apache Camel 有一个叫做 Resequencer 的东西可以做到这一点,它包括一个很好的图表(我没有足够的代表直接嵌入)。这正是我想要的:接收无序消息并将它们按顺序排列的东西。
但是,我不希望它是用 Java 编写的,我需要该解决方案具有高可用性(即能够抵抗典型的系统故障,如崩溃或系统重新启动),我认为 Apache Camel 无法提供。
我们的应用程序是用 Node.js 编写的,使用 Redis 和 Postgresql 进行数据持久化。我们将Kue库用于我们的消息队列。尽管 Kue 提供优先排队,但功能集对于上述用例来说太有限了,所以我认为我们需要一种替代技术来与 Kue 协同工作来重新排序我们的消息。
我试图在网上研究这个话题,但我找不到预期的那么多信息。看起来像分布式架构模式的类型,会有大量的文章和实现,但我没有看到那么多。搜索诸如“消息重新排序”、“乱序处理”、“并行消息处理”等内容,可以找到大多数只是放宽基于分区或主题或诸如此类的“有序”要求的解决方案。或者,他们谈论在单台机器上的并行化。我需要一个解决方案:
我们目前的计划,对我来说很有意义,但我在网上找不到任何描述,是使用 Redis 来维护一组进行中和准备发送的消息,按到达时间排序。粗略地说,它是这样工作的:
我会编写一个小型 Node 库,它使用原子 Redis 事务通过优先级队列式 API 实现此行为。但这只是我自己想出来的,所以我想知道:是否有其他技术(理想情况下使用我们已经在使用的 Node/Redis 堆栈)可以解决重新排序乱序消息的问题? 或者是否有其他术语可以用作我可以用作研究关键字的此问题?谢谢你的帮助!
在 Raft 论文中,他们提到所有客户端交互都发生在领导节点上。我不明白的是,领导者一直在变化。因此,假设我的集群位于负载均衡器之后。如何通知负载均衡器领导者已更改?或者,如果我是对的,负载均衡器是否可以向任何节点(跟随者或领导者)发送客户端请求,并且跟随者节点有责任将请求发送给领导者?
我正在寻找分布式计时器服务。多个远程客户端服务应该能够在指定的时间间隔后注册回调(通过 REST api)。间隔的长度可以是 1 分钟。我可以忍受大约 1 分钟的误差。此类回调的数量目前可以达到 100,000,但我以后需要扩大规模。我一直在寻找类似的调度程序,Quartz但我不确定它们是否适合这个问题。使用Quartz,我可能不得不将回调请求保存在数据库中,并每分钟轮询 100,000 行的过期请求。我不确定这会扩大规模。是否有任何开箱即用的解决方案?否则,我该如何建造一个?
在牛皮纸中,第5.4.2节
如果领导者在提交条目之前崩溃,则未来的领导者将尝试完成复制条目。但是,领导者一旦将其存储在大多数服务器上,就无法立即得出结论,即上一个条目的条目已提交。可能存在这样的情况,旧的日志条目存储在大多数服务器上,但仍可能被将来的领导者覆盖。
作者提到,要避免上述情况
为了消除类似图8中的问题,Raft决不通过对副本数进行计数来提交前项的日志条目。通过计算副本数,仅提交领导者当前任期的日志条目;一旦以这种方式提交了当前术语的条目,则由于“日志匹配”属性而间接提交了所有先前的条目。
但是会不会仍然出现同样的问题?
鉴于作者提供的以下情况
当S5当选领导者时,它只会查看其当前已提交的日志,(term3, index1)这将覆盖term2所有关注者中的条目。
让领导者查看自己的已提交日志如何解决该问题?
如果我有一个distributed.Client实例,我可以用它来关闭远程集群吗?即杀死所有工人并关闭调度程序?
如果使用Client实例无法做到这一点,除了手动杀死每个远程进程之外,还有其他方法吗?
这是在我的机器上重现错误的代码:
import numpy as np
import xgboost as xgb
import dask.array as da
import dask.distributed
from dask_cuda import LocalCUDACluster
from dask.distributed import Client
X = da.from_array(np.random.randint(0,10,size=(10,10)))
Y = da.from_array(np.random.randint(0,10,size=(10,1)))
cluster = LocalCUDACluster(n_workers=4, threads_per_worker=1)
client = Client(cluster)
dtrain = xgb.dask.DaskDeviceQuantileDMatrix(client=client, data=X, label=Y)
params = {'tree_method':'gpu_hist','objective':'rank:pairwise','min_child_weight':1,'max_depth':3,'eta':0.1}
watchlist = [(trainLong, 'train')]
reg= xgb.dask.train(client, params, dtrain, num_boost_round=10,evals=watchlist,verbose_eval=1)
Run Code Online (Sandbox Code Playgroud)
这是错误的摘要:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-ff1b0329f2f9> in <module>
1 params = {'tree_method':'gpu_hist','objective':'rank:pairwise','min_child_weight':1,'max_depth':3,'eta':0.1}
2 watchlist = [(trainLong, 'train')]
----> 3 regLong = xgb.dask.train(client, params, trainLong, …Run Code Online (Sandbox Code Playgroud)