Атомарные вызовы RPC

#atomic #deepstream.io

#атомарный #deepstream.io

Вопрос:

Не могли бы вы сказать мне, выполняется ли RPC атомарно?

Например, при совершении транзакции между двумя учетными записями у меня был бы такой RPC:

 1. client.rpc.provide('xfer', (data, response) => {
2.   var srcWallet = getRecord(data.srcWalletId);
3.   var dstWallet = getRecord(data.dstWalletId);
4.   if (srcWallet.get('balance') >= data.xferAmount) {
5.     srcWallet.set('balance', srcWallet.get('balance') - xferAmount);
6.     dstWallet.set('balance', dstWallet.get('balance')   xferAmount);
7.   }
 

Точно ли, что баланс srcWallet не может измениться между строками 4 и 5?

Ответ №1:

Просто чтобы уточнить: deepstream выполняет RPC (запрос / ответ) с использованием ds.rpc.make/ds.rpc.provide , ваш пример относится к записям.

Приведенный выше пример будет временно работать для однопоточных реализаций JavaScript, однако вы не можете быть уверены, что на пути к клиенту не будет входящей транзакции, которая изменит баланс кошелька. Для обеспечения соблюдения правил, подобных приведенным выше, используйте правило Valve на сервере, например

_('src-wallet').balance >= data.xferAmount

Пожалуйста, найдите больше на

https://deepstream.io/tutorials/core/permission-conf-simple/
https://deepstream.io/tutorials/core/permission-conf-advanced/
https://deepstream.io/tutorials/core/permissions-dynamic/

Комментарии:

1. Я пропустил RPC, приведенный выше для краткости, я спрашиваю, потому что на странице RPC ( deepstream.io/tutorials/core/request-response-rpc ) в нем упоминается «Безопасное объединение многоступенчатых транзакций записей», из вашего ответа кажется, что это верно только для одного поставщика RPC в одном потоке?