我目前正在尝试构建一个本质上需要跨服务器和每个客户端进行良好时间同步的应用程序.我的应用程序有替代设计可以消除这种同步需求,但是当我的应用程序不存在时,我的应用程序很快就会开始吮吸.
如果我遗漏了一些东西,我的基本问题是:在同一时刻在多个地点发起一个事件.我能说的最好,这样做的唯一方法就是需要某种时间同步,但我可能错了.我尝试过以不同方式对问题进行建模,但这一切都回到了a)一个糟糕的应用程序,或者b)需要时间同步.
让我们假设我真的需要同步时间.
我的应用程序基于Google AppEngine构建.虽然AppEngine不保证其服务器上的时间同步状态,但通常它是非常好的,大约几秒钟(即优于NTP),但是有时它会糟糕地说,比如大约10秒钟同步 我的应用程序可以处理2-3秒不同步,但10秒对于用户体验是不可能的.所以基本上,我选择的服务器平台没有提供非常可靠的时间概念.
我的应用程序的客户端部分是用JavaScript编写的.我们再次遇到客户端没有可靠的时间概念的情况.我没有做任何测量,但我完全期望我的一些最终用户拥有设置为1901,1970,2024等的计算机时钟.基本上,我的客户端平台没有提供可靠的时间概念.
这个问题开始让我有点生气.到目前为止,我能想到的最好的事情就是在HTTP之上实现像NTP这样的东西(这并不像听起来那么疯狂).这可以通过在因特网的不同部分中调试2或3个服务器来工作,并且使用传统方式(PTP,NTP)来尝试确保它们的同步至少在几百毫秒的量级.
然后,我将创建一个JavaScript类,该类使用这些HTTP时间源(以及可从XMLHTTPRequest获得的相关往返信息)实现NTP交集算法.
正如你所知,这个解决方案也很糟糕.它不仅非常复杂,而且只能解决问题的一半,即为客户提供当前时间的良好概念.然后,我必须在服务器上妥协,或者允许客户端在发出请求时根据它们告诉服务器当前时间(大安全性禁止,但我可以减轻一些更明显的滥用此行为),或让服务器向我的一个神奇的HTTP-over-NTP服务器发出单个请求,并希望该请求足够快地完成.
这些解决方案都很糟糕,我迷失了.
提醒:我想要一堆Web浏览器,希望多达100个或更多,能够在同一时间触发事件.
大家好.我想学习分布式算法,所以我正在寻找任何书籍推荐.我对理论书籍更感兴趣,因为实现只是品味的问题(我将使用erlang(或c#)).但另一方面,我不想要原始的,数学的算法分析.只是这个想法是如何工作的,以及为什么它的工作原理.
这是一个采访问题:"如何构建分布式算法来计算括号的平衡?"
通常他的平衡算法从左到右扫描一个字符串形式,并使用一个堆栈来确保开括号的数量总是> =闭括号的数量,最后是开括号的数量==近括号的数量.
你会如何分发它?
我想为使用Galera集群(mysql)作为DB的分布式应用程序添加缓存.每个应用程序节点(java)都有一个本地缓存,用于读取和与数据库节点通信.
问题是当集群中的另一个节点修改了条目时,我不知道如何使缓存中的条目无效.
我的第一次尝试是使用数据库触发器,但我很快就意识到复制更新不会引发触发器.
其他想法是监视网络流量搜索修改或观看DB的binlog,但它们似乎都很难实现.
问题是:是否有任何实用的方法来检测复制中来自另一个节点的变化?
实现缓存失效的其他想法?
我想我也可以使用通过应用程序节点传递更改的分布式缓存,但我更喜欢在每个应用程序节点中使用隔离缓存,并将节点之间的数据同步委托给数据库集群.我认为缓存通信是冗余的网络流量......
提前致谢.
如何以分布式方式计算大(> 10TB)数据集的皮尔森互相关矩阵?任何有效的分布式算法建议将不胜感激.
更新:我读了apache spark mlib相关的实现
Pearson Computaation:
/home/d066537/codespark/spark/mllib/src/main/scala/org/apache/spark/mllib/stat/correlation/Correlation.scala
Covariance Computation:
/home/d066537/codespark/spark/mllib/src/main/scala/org/apache/spark/mllib/linalg/distributed/RowMatrix.scala
Run Code Online (Sandbox Code Playgroud)
但对我来说,看起来所有的计算都发生在一个节点上,而且它并没有真正意义上的分布.
请点亮这里.我也尝试在3节点火花簇上执行它,下面是截图:
正如你从第二张图片中看到的那样,在一个节点上提取数据然后正在进行计算.我在这里吗?
algorithm distributed distributed-computing cross-correlation apache-spark
我目前面临一个问题,我可以肯定有一个正式名称,但是我不知道该在网上搜索什么。我希望如果我描述问题和解决方案时想到的,有人能够告诉我设计模式的名称(如果有一个与我要描述的内容相匹配的设计模式)。
基本上,我想拥有一个工作队列:我有多个创建工作的客户端(发布者),以及许多处理这些工作的工人(消费者)。现在,我想将发布者创建的作业分发给各个使用者,这基本上可以使用几乎任何消息队列并在整个队列中实现负载均衡,例如使用RabbitMQ甚至MQTT 5。
但是,现在事情变得复杂了……每个工作都指向一个外部实体,例如一个用户。我想要的是按顺序处理单个用户的作业,但并行处理多个用户的作业。我不要求用户X的作业始终去工作者Y,因为无论如何它们都应按顺序处理。
现在,我可以使用RabbitMQ及其一致的哈希交换来解决此问题,但是当新的工作人员进入集群时,我就会进行数据竞赛,因为RabbitMQ不支持重新定位已经在队列中的作业。
MQTT 5也不支持:在这里,这个想法被称为“粘性共享订阅”,但这不是官方的。它可能是MQTT 6的一部分,也可能不是。谁知道。
我也看过NSQ,NATS和其他一些经纪人。他们中的大多数甚至都不支持这种非常特定的情况,而那些确实使用一致哈希的情况,则存在前面提到的数据竞速问题。
现在,如果代理在作业到达后不将作业分类到队列中,而是跟踪某个特定用户的作业是否已经在处理中,则问题将消失:如果这样,它将延迟所有其他作业该用户,但其他用户的所有作业仍应处理。使用RabbitMQ等人无法做到这一点。
我很确定我不是唯一拥有用例的人。例如,我可以想到用户将视频上传到视频平台,尽管上传的视频是并行处理的,但单个用户上传的所有视频都是按顺序处理的。
因此,简而言之:我所形容的名字是用一个普通名字吗?诸如分布式作业队列之类的东西?具有任务相似性的任务调度程序?还是其他?我尝试了很多术语,但没有成功。这可能意味着没有解决方案,但是如上所述,很难想象我是这个问题上唯一的人。
有什么想法我可以寻找吗?并且:是否有实现此目的的工具?有协议吗?
PS:仅使用预定义的路由密钥是不可行的,因为用户ID(我在这里只是作为一个示例)基本上是UUID,因此可以有数十亿个,因此我需要更多动态的东西。因此,一致性哈希基本上是正确的方法,但是如上所述,为了避免数据争用,分发必须逐个进行而不是预先进行。
distributed design-patterns message-queue dispatcher job-queue
据我所知,为节点本地数据生成自动二级索引.
在这种情况下,通过二级索引查询涉及存储列族的一部分的所有节点以获得结果(?)所以(如果我是对的)如果数据分布在50个节点上,则单个查询中涉及50个节点?
这可以扩展多远?这比手动二级索引(倒排索引列系列)更具可扩展性吗?几个节点或一百个节点?
我希望实现一个可以在地理上广泛分布的数据库,这样每个节点都可以读取/写入,并最终与所有其他节点保持一致.我应该在哪里看?
我认为MongoDB在出现这种担忧之前似乎是其他原因的不错选择.显然所有MongoDB节点都是可读的,但只有主节点是可写的?反正有没有绕过这个?我不能允许单点失败写入数据库.
database distributed scalability eventual-consistency mongodb
正如论文所说:
选举安全:在一个特定的任期内,最多只能选出一名领导人.§5.2
但是,系统中可能有多个领导者.筏只能承诺在给定的期限内只有一个领导者.所以如果我有多个客户端,我不会得到不同的数据吗?这如何让Raft成为一致的算法?
有什么我不明白的,有人可以解释一下吗?
distributed ×10
algorithm ×4
apache-spark ×1
caching ×1
cassandra ×1
consensus ×1
database ×1
dispatcher ×1
galera ×1
indexing ×1
java ×1
job-queue ×1
mongodb ×1
mysql ×1
networking ×1
nosql ×1
p2p ×1
raft ×1
scalability ×1
time ×1