java - 哪些分布式事务的中间件可以保证幂等性?
ringa_lee
ringa_lee 2017-04-18 09:25:54
0
3
555


如图所示,bool withdraw(account_id, amount)函数表示:从account_id对应的账户中扣除amount数额的钱;如果扣除成功则返回true,账户余额减少amount;如果扣除失败则返回false,账户余额不变。
如果withdraw请求已经被服务器端正确处理,但服务器端的返回结果由于网络等原因被掉丢了,导致客户端无法得知处理结果。如果是在网页上,一些不恰当的设计可能会使用户认为上一次操作失败了,然后刷新页面,这就导致了withdraw被调用两次,账户也被多扣了一次钱。因此我们要做幂等控制。
问题:
如果采用采用分布式事务,通过引入支持分布式事务的中间件来保证withdraw功能的事务性,有哪些中间件可以提供这些功能?具体怎么实现的啊?

ringa_lee
ringa_lee

ringa_lee

répondre à tous(3)
PHPzhong

Tout d'abord, RocketMQ, le middleware de messages open source d'Alibaba, s'appelait à l'origine MetaQ. Le document indique qu'il prend en charge les transactions distribuées, car tous les aspects de RocketMQ, y compris les producteurs, les consommateurs et les courtiers, sont distribués, donc fondamentalement, il peut. être assuré qu'il sera perdu pour des raisons de réseau, mais nous n'avons pas utilisé cette fonctionnalité dans le projet. De plus, RocketMQ a le problème de la consommation répétée, donc le document montre clairement que le côté commercial devrait implémenter l'idempotence par lui-même

Deuxièmement, je pense que dans la plupart des cas, les transactions distribuées sont rarement mises en œuvre. Dans la plupart des cas, la cohérence finale est suffisante et les performances des transactions distribuées sont faibles.

De plus, l'idempotence n'a en réalité pas grand-chose à voir avec la transactions distribuées que vous avez mentionnées. Dans le même scénario, même si vos systèmes sont tous ensemble, que devez-vous faire si vous recevez deux demandes identiques Si l'idempotence n'est pas atteinte, ce n'est pas le cas. Dans les scénarios distribués, il y aura également plus de déductions. 🎜> Et l'idempotence peut être obtenue en émettant des jetons (il y a en fait de nombreux articles introduits)

黄舟

Tout d’abord, ce scénario n’a rien à voir avec les transactions distribuées !
Deuxièmement, concernant l'idempotence des services, il existe de nombreuses façons de la garantir. Spécifique à votre scénario, vous pouvez définir une requête dans le protocole pour représenter le requestID Côté serveur, vérifiez ce requestID, par exemple en utilisant simple. redis Les verrous distribués ou autres verrous distribués peuvent être vérifiés pour l'idempotence

左手右手慢动作

Cela implique une nouvelle tentative en cas d'échec, donc l'interface du fournisseur doit être idempotente. Cependant, les interfaces telles que la déduction d'inventaire sont difficiles à atteindre l'idempotence, il est donc recommandé de fermer la nouvelle tentative échouée sur les interfaces ayant échoué.
Pour ce scénario du questionneur, la raison principale est que l'appelant a échoué en raison d'un délai d'attente et n'a pas annulé amount, car si je suppose que c'est correct, cela devrait être un appel RPC, donc le questionneur a vraiment besoin de transactions distribuées sont utilisés pour effectuer l'annulation des transactions. Pour plus de détails, vous pouvez vous référer à ByteTCC. L'utilisation de TCC est également une solution

.
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal