我们正在Amazon Web Services堆栈上构建一个Web应用程序,到目前为止我很喜欢它.
我们也在充分利用测试驱动的开发,这也证明是非常棒的.
我只是希望有人可以帮助我解决我遇到的与Amazon SimpleDB的"最终一致性"相关的问题.
出现此问题的最佳示例是在单元测试中添加用户,然后通过调用获取新添加的用户来检查用户是否已成功添加.
我可以轻松地继续前进,只是为此编写测试,它可以正常工作,但我知道"最终的一致性"以及当我拨打电话获取用户时,用户可能实际上没有补充说.显然,如果调用了fetch用户函数并且用户不在系统中,则它将返回false或failure.
我想知道的是处理这个问题的最佳方法是什么?我已经看到了建立一个函数的建议,这个函数在请求之间休眠5秒并尝试10次.我也看到过具有指数退避的解决方案.什么是最佳解决方案?
使用CQRS和事件存储,微服务之间的编排提供了最终的一致性,其中一个微服务中的更改需要一点时间才能传播到相关的其他下游系统(基本上是其他微服务)。如果数据非常关键以至于两个微服务都应该对数据具有很强的一致性,那么有哪些选择呢?我可以想到的一个选择是像数据网格一样通过Cache进行写操作,但是特别是在分布式系统中,它非常脆弱。
当并发写入发生时,Cassandra如何保证最终的一致性?
例如,客户端A写入tableA.rowA.colA,同时客户端B写入tableA.rowA.colA.
协调器节点将请求分发给副本节点,例如NodeA NodeB和NodeC.
在NodeA上,ClientA请求首先到达.在NodeB上,ClientB请求首先到达.那么,它会永远不一致吗?
我是 ES7 的新手,正在尝试了解乐观并发控制。
我想我明白,当我获取请求一个文档并将其_seq_no
和_primary_term
值在稍后的写入请求中发送到同一文档时,如果值不同,则写入将被完全忽略。
但是,在我不发送 和 _seq_no
值的默认情况下,文档会发生什么情况_primary_term
?_seq_no
即使它具有较旧的_primary_term
值(因此使索引不一致),写入也会继续进行,还是仅在值较新时才被处理?
如果是前者,文档最终会保持一致吗?
我试图弄清楚我是否需要发送这些值以获得最终的一致性,或者我是否可以免费获得它而不发送这些值。
multithreading distributed-system eventual-consistency optimistic-concurrency elasticsearch
我在使用Docker容器的单台机器上设置了一个完全复制的3节点Cassandra集群,具有以下状态:
Datacenter: dc_n1
=================
Status Address Load Tokens Owns Host_ID Rack
UN 172.18.0.3 83.98 MiB 256 100.0% 5bf rack_n1
Datacenter: dc_n2
=================
Status Address Load Tokens Owns Host_ID Rack
UN 172.18.0.6 83.52 MiB 256 100.0% 0518 rack_n2
Datacenter: dc_n3
=================
Status Address Load Tokens Owns Host_ID Rack
UN 172.18.0.2 83.52 MiB 256 100.0% ca95 rack_n3
现在考虑以下键空间:
create KEYSPACE stackoverflow WITH replication = {'class': 'NetworkTopologyStrategy', 'dc_n1':1,'dc_n2':1,'dc_n3':1};
和一个定义为的表(假设T_notID是唯一的):
create TABLE stackoverflow.TABLE (T_ID int PRIMARY KEY, T_notID int, T_Data text);
当我发送一个(例如,一百个)并发Java线程向Cassandra节点提交以下两个JDBC查询(重复,一分钟)时,我看到(B)查询的性能下降100倍:
(A)SELECT T_Data …
在过去的两天里,我一直在阅读和学习NoSQL和MongoDB,CouchDB等,但我仍然无法判断这是否适合我.
让我担心的是最终的一致性.在使用集群时,这种一致性是否只会起作用?(我在一个专用服务器上托管我的网站,所以我不知道我是否可以从NoSQL中受益)对于哪种应用程序可以最终保持一致(而不是ACID),以及哪些应用程序不是T' 你能举个例子吗?在应用程序中可能发生的最糟糕的事情是什么,以确保最终的一致性?
我读到的另一件事是MongoDB在内存中保留了很多东西.在文档中,它描述了一些有2GB数据限制的32位系统.那是因为32位系统的ram限制吗?
举个例子,假设我正在构建一个简单的社交网络。我目前有两项服务:
Identity
,管理用户、他们的个人数据(电子邮件、密码哈希等)及其公共配置文件(用户名)和身份验证Social
,管理用户的帖子、朋友和动态该Identity
服务可以使用其 API 提供用户的公共资料/api/users/{id}
:
// GET /api/users/1 HTTP/1.1
// Host: my-identity-service
{
"id": 1,
"username": "cat_sun_dog"
}
Run Code Online (Sandbox Code Playgroud)
该Social
服务可以在以下位置发布其 API 的帖子/api/posts/{id}
:
// GET /api/posts/5 HTTP/1.1
// Host: my-social-service
{
"id": 5,
"content": "Cats are great, dogs are too. But, to be fair, the sun is much better.",
"authorId": 1
}
Run Code Online (Sandbox Code Playgroud)
这很好,但我的客户端(一个 Web 应用程序)希望显示带有作者姓名的帖子,并且它最好在一个 REST 请求中接收以下 JSON 数据。
{
"id": 5,
"content": "Cats are great, dogs are too. …
Run Code Online (Sandbox Code Playgroud) 我们正在使用Titan 1.0.0和Cassandra版本3.9.0-1,来自CentOs-7系统上的datastax- ddc.我们看到一些奇怪的问题,例如:
具有相同边ID的多个边,这些边上的少数属性的值不同.
gV().has('msid',6171699).outE('prio_child').has('hostid_e',153).as('e')inV().has('msid',58713376).select( 'e')==> e [ 54ekdatm-1lezwb4-45cl-195s9km8 ] [3471761488-prio_child-> 98305011872] ==> e [ 54ekdatm-1lezwb4-45cl-195s9km8 ] [3471761488-prio_child-> 98305011872]
在应用更多限制后获得更多结果
gV().has('msid',6171699).outE('prio_child').count()
==> 60
gV().has('msid',6171699).outE('prio_child').has('hostid_e,153).count()
==> 66
我甚至尝试过设置ConsistencyModifier.LOCK,正如Titan文档最终一致后端所建议的那样,但它没有帮助.我仍然得到任意结果.
cassandra ×3
nosql ×2
api-gateway ×1
asp.net-core ×1
couchdb ×1
cqrs ×1
mongodb ×1
performance ×1
replication ×1
tdd ×1
titan ×1
unit-testing ×1