虽然每个微服务通常都有自己的数据 - 但某些实体需要在多个服务之间保持一致.
对于高度分布式环境(如微服务架构)中的此类数据一致性要求,设计有哪些选择?当然,我不想要共享数据库体系结构,其中单个数据库管理所有服务的状态.这违反了孤立和无共享的原则.
我明白,微服务可以在创建,更新或删除实体时发布事件.对此事件感兴趣的所有其他微服务可以相应地更新其各自数据库中的链接实体.
这是可行的,但它会导致整个服务中的许多仔细和协调的编程工作.
Akka或任何其他框架可以解决这个用例吗?怎么样?
编辑1:
为清楚起见,添加下图.
基本上,我试图理解,如果今天有可用的框架可以解决这个数据一致性问题.
对于队列,我可以使用任何AMQP软件,如RabbitMQ或Qpid等.对于数据一致性框架,我不确定目前Akka或任何其他软件是否可以提供帮助.或者这种情况是如此罕见,以及这种反模式,不需要任何框架?
我正在开发一个应用程序,用户必须拨打电话并使用手机键盘输入验证码.
我希望能够检测出他们输入的数字是否正确.电话系统无法访问有效号码列表,而是根据算法(如信用卡号码)验证号码.
以下是一些要求:
鉴于这些要求,您将如何生成这样的数字?
编辑:
@Haaked:代码必须是数字的,因为用户用它的电话键入它.
@matt b:第一步,代码显示在网页上,第二步是调用并输入代码.我不知道用户的电话号码.
Folowup:我发现了几种算法来检查数字的有效性(参见Google代码项目:checkDigits).
我有点困惑data consistency
和data integrity
.来自Oracle数据库概念:
data integrity
--------------
Business rules that dictate the standards for acceptable data. These rules
are applied to a database by using integrity constraints and triggers to
prevent invalid data entry.
Run Code Online (Sandbox Code Playgroud)
来自维基百科
Consistency
-----------
Consistency states that only valid data will be written to the database.
Run Code Online (Sandbox Code Playgroud)
那么data consistency
和之间的区别是data integrity
什么?
提前致谢.
这里的一些开发人员正在讨论关于来自RESTful API的GET请求是否应该返回所请求资源的ID的友好(有些人会说是宗教性的).我们假设以下GET请求:
http://my.api.com/rest/users/23
目前返回:
{"name": "Jim", "age": 40, "favoriteColor": "blue"}
Run Code Online (Sandbox Code Playgroud)
请注意,结果集中缺少"id".
基本上有4个阵营与这个问题作斗争.
CAMP#1:当呼叫者发出GET请求时,他们已经知道了ID.因此,结果集应该不包括ID.如果调用者需要此数据来启用UI编辑,则调用者需要通过ID 23,可能手动将成员{"id":23}添加到JSON.
Camp#1中的人员也认为结果集中ID的存在表明该值可以被修改,当然它不能.
CAMP#2:没有ID,JSON结果集本身不能用于UI表单中的编辑/更新操作.相反,AJAX回调机制需要负责传递ID字段并手动将这些字段添加到结果集中.这似乎很笨拙且容易出错.UI人员正在争论结果集"感觉"就像缺少应该存在的数据,即ID.
营地#3:这些人关心的是一致性.如果我们有API返回的用户对象集合,这些对象必须包含ID.因此,为了保持一致性,GET的单例版本还应包含ID.
CAMP#4:这些人建议用户的GET请求可以返回包含ID的HyperMedia或SelfLinks形式的元数据.
这不是一个深奥的"谁是对的?" 争论,或者.我们采用的方法将决定API的形状,并影响几个开发人员在新的几周内的工作量.
我想知道adler32校验和与md5校验和相比有多可靠?在维基百科上告诉我,adler32"比md5"更"可靠",所以我想知道它有多少,以及以哪种方式?
更具体地说,我想知道它是否足够可靠作为长期存档大小为20GB +的(tar)文件的一致性检查?
我是Cassandra的新手,我读过Cassandra鼓励非规范化和重复数据.这让我有点困惑.让我们想象以下场景:
我有一个包含四个表的键空间:A,B,C和D.
CREATE TABLE A (
tableID int,
column1 int,
column2 varchar,
column3 varchar,
column4 varchar,
column5 varchar,
PRIMARY KEY (column1, tableID)
);
Run Code Online (Sandbox Code Playgroud)
让我们假设其他表(B,C,D)具有与表A相同的结构和相同的数据,只有不同的主键,以便响应其他查询.
如果我升级表A中的一行,我如何确保具有相同数据的其他表中的数据的一致性?
让我解释数据一致性问题的含义.以下面的场景为例
uint16 x,y;
x=0x01FF;
y=x;
Run Code Online (Sandbox Code Playgroud)
显然,这些变量是16位,但如果这个代码使用8位CPU,则读或写操作不会是原子的.因此,中间可能发生中断并改变值.这是可能导致数据不一致的一种情况.
这是另一个例子,
if(x>7) //x is global variable
{
switch(x)
{
case 8://do something
break;
case 10://do something
break;
default: //do default
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的摘录代码中,如果中断在if语句之后但在switch语句之前将x的值从8更改为5,那么我们最终会出现默认情况,而不是情况8.
请注意,我正在寻找方法来检测这种情况(但不是解决方案)
是否有任何工具可以检测嵌入式C中的此类问题?
用什么算法计算一个数字列表的校验位?
列表的长度在8到12位之间.
另请参阅:
如何生成验证码/号码?
这特别是关于保持使用各种复制解决方案的信心,您可以将其故障转移到其他服务器而不会丢失数据.或者在主 - 主情况下,如果其中一个数据库失去同步,您可以在合理的时间内知道.
是否有任何工具可用于此,或者人们通常依赖复制系统本身来警告不一致?我目前最熟悉在主 - 备用设置中的postgresql WAL运输,但我正在考虑使用像PgPool这样的主 - 主设置.但是,由于该解决方案与PostgreSQL本身的关系不那么直接(我的基本理解是它提供了应用程序将使用的连接,因此拦截了各种SQL语句,然后将它们发送到其池中的任何服务器)它让我更多地考虑实际验证数据的一致性.
具体要求:
我不是在谈论桌面结构.我想知道实际的记录数据是一样的,所以我知道记录是否已损坏或丢失(在这种情况下,我会使用最近的备份+ WAL文件重新初始化坏数据库,然后再将其恢复进入游泳池)
数据库大约为30-50 GB.我怀疑原始的SELECT查询是否能很好地工作.
我不认为需要实时检查(当然,它会很好).每小时甚至每天都会比什么都好.
块级检查不起作用.它将是两个具有独立存储的数据库.
或者这种类型的验证是不现实的?
我无法弄清楚如何跨多个表维护属性更新以确保数据一致性。
例如,假设我有演员和粉丝之间的多对多关系。一个粉丝可以养很多演员,一个演员也有很多粉丝。我做了几个表来支持我的查询
CREATE TABLE fans (
fan_id uuid,
fan_attr_1 int,
fan_attr_2 int
PRIMARY KEY ((fan_id))
)
CREATE TABLE actors (
actor_id uuid,
actor_attr_1 int,
actor_attr_2 int
PRIMARY KEY ((actor_id))
)
CREATE TABLE actors_by_fan (
fan_id uuid,
actor_id uuid,
actor_attr_1 int,
actor_attr_2 int
PRIMARY KEY (fan_id, actor_id)
)
CREATE TABLE fans_by_actor (
actor_id uuid,
fan_id uuid,
fan_attr_1 int,
fan_attr_2 int
PRIMARY KEY (actor_id, fan_id)
)
Run Code Online (Sandbox Code Playgroud)
假设我是一个粉丝,我在我的设置页面上,我想将 my 更改fan_attr_1
为不同的值。
在fans
表上,我可以很好地更新我的属性,因为应用程序知道我的 fan_id 并且可以键入它。
但是fan_attr_1
,如果fans_by_actor
不先查询与风扇关联的 actor_id,我就无法更改我的状态。 …
data-consistency ×10
checksum ×3
algorithm ×2
cassandra ×2
adler32 ×1
akka ×1
api ×1
c ×1
cql ×1
database ×1
duplicates ×1
embedded ×1
json ×1
md5 ×1
postgresql ×1
replication ×1
rest ×1
transactions ×1