我在erlang写了一个bittorrent跟踪器.鉴于服务的性质,我不需要绝对的一致性(即客户可以完全满意稍微过时的同行列表或torrent状态).
到目前为止,我的策略是在启用了disc_copies的情况下在RAM中创建mnesia表,以便在日志大小超过特定大小时让mnesia自动将内存转储到磁盘.
如果服务器崩溃,某些信息将丢失.没有大碍.
另一种方法是实例化两个表(仅一个ram和一个磁盘),并且每分钟左右都有一个从ram到磁盘的进程副本.这更天真,但是只允许转储内存中的一部分,减少整体磁盘开销,并可能完全避免使用日志(我实际上不确定这最后的语句).
我确信还有很多其他方法可以做到这一点.你的是啥呢?
-TeO
场景是一个包含联系人列表的网格.用户点击网格中的"发送电子邮件",发送电子邮件.我们在队列中删除一条消息来更新一些聚合(它们也显示在列表中).
问题是在发送电子邮件之后,聚合不能保证更新.
我们可以使用javascript更新计数,但如果他们刷新页面并且聚合尚未完成呢?
根据CAP理论,Cassandra最终只能具有一致性.更糟糕的是,如果我们在一次请求中有多次读写而没有正确处理,我们甚至可能失去逻辑一致性.换句话说,如果我们快速做事,我们可能做错了.
同时,为Cassandra设计数据模型的最佳实践是考虑我们将要拥有的查询,然后添加一个CF. 通过这种方式,添加/更新一个实体意味着在许多情况下更新许多视图/ CF. 没有原子事务功能,很难做到正确.但有了它,我们又失去了A和P部分.
我不认为这涉及很多人,因此我想知道为什么.
是否存在分布式高可用性,最终是一致的db,它支持标量值的幂等操作?
如果我们使用正常更新,那么我们可能会在不同节点上有2个不同的值,并且没有一个值是正确的,因为我们需要通过两个事务值来增加金额.
是否有分布式数据库,我可以发送命令增加(键,属性[列],差异),以便当我收到响应时,我可以确定该操作将在其他副本上执行,无论帐户的当前值如何?通过这种方式,即使两个不同的节点增加了不同的值,我也将具有增加操作的最终一致性,因为该增加将传播到其他副本.
我不是在讨论条件更新,因为它不适用于cassandra这样的高可用性db(这就是为什么它们没有这个功能),我对原子增加操作感兴趣.
谢谢.
PS在幂等增加的情况下,我会有一个命令增加(key,attribute,diff,lock_key),这样如果db已经收到相同的lock_key相同的命令,db就不会增加
TL;博士:
有没有办法在分布式AP类数据库中制作精确的计数器?2个问题:1)如果我发送操作来增加一个计数器并且我没有得到响应,我会再次发送该请求,但不想两次增加计数器.2)如果该计数器在另一个副本上同时更新,我希望最终合并这个增加,而不是覆盖这些值.那么是否有像增加("John的余额",+ 5.67,"sdfsdfas")这样的命令,其中sdfsdfas是用于丢弃重复更新的字符串.是否有一个db复制这种命令?
database high-availability eventual-consistency cassandra nosql
CloudSearch的结果只是最终一致的.
在我的95%的应用程序中,这是它提供的性能和冗余的可接受的权衡.
在最后的5%中,我发现自己发布了一个新的SDF文档,然后立即运行一个查询,我需要反映我刚刚做的POST.
目前,我有一个拼凑在一起的解决方案,涉及轮询CloudSearch,直到结果符合我的预期,直接在POST之后.不幸的是,当我有多个用户时,这会产生许多问题,包括与额外读取相关的成本($)增加到竞争条件.
处理这种情况有什么最佳做法吗?
来自AWS论坛的xpost:https://forums.aws.amazon.com/thread.jspa?messageID = 470636
编辑:有关我的具体用例的其他信息.
我正在搜索带有大量布尔查询的搜索结果,我希望能够更新一个或多个文档,使它们不再出现在查询中,然后刷新视图以显示结果.
具体来说,我有一堆带有布尔值的文档,标记为"已归档"
当我在未归档的视图中查看它们,然后将它们标记为已归档时,我希望能够刷新视图而不显示这些项目.
我也使用CloudSearch进行排序/过滤/分页,这使得插入或修改本地副本变得很困难
consistency eventual-consistency amazon-web-services amazon-cloudsearch
我遇到了(重新)在读/查方面以正确顺序应用来自多个主题的事件的问题.
例:
在写/命令端,我们有2个具有n:m关系的聚合:
这些聚合在2个单独的事件流主题上产生以下事件(因为最佳实践说:每个聚合一个主题.我完全同意):
联系主题:
ContactCreated (contactId: "123", name: "Peter")
ContactAddedToGroup (contactId: "123", groupId: "456")
小组主题:
GroupCreated (groupId: "456", name: "Customers")
在读取/查询方面(例如Elasticsearch)我想执行此查询:
Custo...
Custo...
(这应该不是问题)为此,有2种读取模型.示例数据:
{contactId: "123", name: "Peter", groups: [{id: "456", name: "Customers"}]}
{groupId: "456", name: "Customers"}
问题:
事件的顺序只能保证单个事件主题(如在Apache Kafka中).虽然3个活动可以通过多种方式读/查询侧消耗:1,2,3
或1,3,2
或3,1,2
怎么处理1,2,3
?数据库伪语句示例:
INSERT Contact (contactId: "123", name: "Peter")
FIND Group WHERE (groupId: "456")
(不起作用,因为尚未插入组)UPDATE Contact WHERE (contactId: "123") ADD …
concurrency eventual-consistency race-condition cqrs event-sourcing
首先,让我们说一个电子商务网站上有两个独立的汇总购物篮和订单。
Basket聚合有两个实体Basket(这是聚合根)和BaskItem定义如下(为简单起见,我删除了工厂和其他聚合方法):
public class Basket : BaseEntity, IAggregateRoot
{
public int Id { get; set; }
public string BuyerId { get; private set; }
private readonly List<BasketItem> items = new List<BasketItem>();
public IReadOnlyCollection<BasketItem> Items
{
get
{
return items.AsReadOnly();
}
}
}
public class BasketItem : BaseEntity
{
public int Id { get; set; }
public decimal UnitPrice { get; private set; }
public int Quantity { get; private set; } …
Run Code Online (Sandbox Code Playgroud) 如果我在现有的RavenDB会话上运行以下查询:
var result = session.Query<Location>()
.Customize(x => x.WaitForNonStaleResultsAsOfNow())
.Where(l => l.Name = "Home" && !l.Deleted);
Run Code Online (Sandbox Code Playgroud)
RavenDB等待哪些索引?我的假设是它等待查询时所有索引都是最新的; 但是,这是否意味着如果Location
其他表上只有一个动态索引而是20个索引,那么我们总是在等待21个索引更新?
或者,我是否误解了该方法的功能?
例如 amazon.com;他们依赖于微服务架构,并且订单和付款可能是单独的微服务,但是当您在 amazon.com 上结帐订单时,您最终可以看到订单 ID 和详细信息。如果这不是最终一致性方法,那是什么?也许是2PC?
我正在概括我的问题;如果最终一致性不适合业务事务(最终用户应该看到事务结束的结果)但单独的微服务有意义(例如订单和付款)怎么办?如何处理即时一致性?
c# ×3
consistency ×3
cassandra ×2
algorithm ×1
concurrency ×1
cqrs ×1
database ×1
distributed ×1
erlang ×1
indexing ×1
mnesia ×1
nosql ×1
ravendb ×1