Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Architecture 高度分布式OLTP体系结构_Architecture_Distributed_Distributed Transactions_Oltp - Fatal编程技术网

Architecture 高度分布式OLTP体系结构

Architecture 高度分布式OLTP体系结构,architecture,distributed,distributed-transactions,oltp,Architecture,Distributed,Distributed Transactions,Oltp,对于适用先决条件的高度分布式OLTP情况,是否有已知的体系结构解决方案?例如,让我们以银行业为例。人员A希望将N美元转账给人员B。成功的先决条件是人员A的帐户中必须有N美元以上 从个人A的角度来看,他们登录到某个web应用程序。他们创建了一个从他们自己到B个人的转账,金额为N美元。请记住,在后台,随着转账的应用和转账的创建,资金将实时从a个人的帐户中提取和存入。资金可能在创建之前就存在,但一旦应用了转账,它可能就不存在了。换句话说,这不能是客户端验证。人员A希望知道此传输已同步成功或失败。人员A

对于适用先决条件的高度分布式OLTP情况,是否有已知的体系结构解决方案?例如,让我们以银行业为例。人员A希望将N美元转账给人员B。成功的先决条件是人员A的帐户中必须有N美元以上

从个人A的角度来看,他们登录到某个web应用程序。他们创建了一个从他们自己到B个人的转账,金额为N美元。请记住,在后台,随着转账的应用和转账的创建,资金将实时从a个人的帐户中提取和存入。资金可能在创建之前就存在,但一旦应用了转账,它可能就不存在了。换句话说,这不能是客户端验证。人员A希望知道此传输已同步成功或失败。人员A不希望异步提交传输,然后稍后返回队列或某个传输失败的通知


是否有一个已知的体系结构可以大规模解决这个问题?如果所有帐户都在一个RDBMS中,那么您可以通过内置的事务功能执行类似的操作。但是,如果您使用的是最终一致的NoSQL风格的数据存储,或者基于日志/消息的基础架构(如Kafka),那么对于类似这样的问题,有一个已知的解决方案吗?

基本上,您需要的是一个分布式锁定机制。许多分布式服务器应用程序都提供了这样的功能

基本上,如果我们把你的问题转换成代码,它会是这样的

//银行提款申请
//从NCache获取BankAccount对象
BankAccount=cache.Get(“Key”)作为BankAccount;//余额=30000
提款金额=15000;
if(account!=null&&account.IsActive)
{
//取款并减少余额
账户余额-=提款金额;
//使用新余额=15000更新缓存
cache.Insert(“Key”,account);
}
=========================

//银行存款申请
//从NCache获取BankAccount对象
BankAccount=cache.Get(“Key”)作为BankAccount;//余额=30000
存款金额=5000;
if(account!=null&&account.IsActive)
{
//存钱,增加余额
账户余额+=存款金额;
//使用新余额=35000更新缓存
cache.Insert(“Key”,account);
}
这基本上是一个种族状况的例子

竞争条件是两个或多个用户试图同时访问和更改相同的共享数据,但最终以错误的顺序执行

分布式锁定中上述代码的答案是

LockHandle LockHandle=new LockHandle();
//指定项目保持锁定的10秒时间跨度
//NCache将在10秒后自动释放锁。
TimeSpan lockSpan=新的TimeSpan(0,0,10);
尝试
{
//如果项目获取成功,将填充lockHandle对象
//lockHandle对象将用于解锁缓存项
//如果要获取锁,则acquireLock应为true。
//如果项目不存在,则帐户将为空
BankAccount=cache.Get(键,锁span,
将锁手柄(acquireLock)作为银行账户;
//已获取锁,否则将引发LockingException异常
if(account!=null&&account.IsActive)
{
//取款或存款
账户余额+=提款金额;
//账户余额-=存款金额;
//将数据插入缓存并同时释放锁
//必须提供最初用于锁定物品的锁柄
//releaseLock应为true以释放锁,否则为false
cache.Insert(“钥匙”、帐户、锁柄、释放锁);
}
其他的
{
//不存在或无法强制转换
//出现错误时显式释放锁
解锁(“钥匙”,锁柄);
} 
}
捕获(锁定异常锁定异常)
{
//无法获取锁
//请稍候再试
}
这个答案非常特定于NCache(分布式缓存)。我相信您会在关键字“分布式锁定”下找到更多解决方案


基本上,您需要的是分布式锁定机制。许多分布式服务器应用程序都提供了这样的功能

基本上,如果我们把你的问题转换成代码,它会是这样的

//银行提款申请
//从NCache获取BankAccount对象
BankAccount=cache.Get(“Key”)作为BankAccount;//余额=30000
提款金额=15000;
if(account!=null&&account.IsActive)
{
//取款并减少余额
账户余额-=提款金额;
//使用新余额=15000更新缓存
cache.Insert(“Key”,account);
}
=========================

//银行存款申请
//从NCache获取BankAccount对象
BankAccount=cache.Get(“Key”)作为BankAccount;//余额=30000
存款金额=5000;
if(account!=null&&account.IsActive)
{
//存钱,增加余额
账户余额+=存款金额;
//使用新余额=35000更新缓存
cache.Insert(“Key”,account);
}
这基本上是一个种族状况的例子

竞争条件是两个或多个用户试图同时访问和更改相同的共享数据,但最终以错误的顺序执行

分布式锁定中上述代码的答案是

LockHandle LockHandle=new LockHandle();
//指定项目保持锁定的10秒时间跨度
//NCache将在10秒后自动释放锁。
TimeSpan lockSpan=新的TimeSpan(0,0,10);
尝试
{
//如果项目获取成功,将填充lockHandle对象
//lockHandle对象将用于解锁缓存项
//如果您希望ac,则acquireLock应为true