Странно это для клиентов будет.
Я посылаю запрос А передает С 10 бочек апельсинов. Потом посылаю запрос С передает Д 5 бочек апельсинов. Мне приходит ответ, что у С ничего нет. И я долго чешу репу, куда же они делись. Ведь он должен был от А получить 10. |
Корректнее выполнять операции с участием С, когда остальные операции с его участием уже выполнились.
|
Цитата:
Т.к. в buffer (список обрабатываемых участников) хранятся только имена участников, то Set отлично подходит для этой задачи — как в реализации, так и в скорости. В pool (очередь участников, которые не смогли попасть в buffer) у нас уже хранятся сами операции, состоящие из 2-х имен участников и действии, которые первый участник хочет сделать для второго. Т.к. Set может хранить только уникальные значения без ключей, то для pool подходит либо Map, либо Object. |
Цитата:
Если вы знаете, что вам участник А должен передать 10 бочек апельсинов, то очевидно же что вы не будете пытаться передать участнику Д 5 бочек, пока не убедитесь, что на вашем складе больше или равно 5 бочек. |
Цитата:
И как последовательно (или еще как) просматривать Map, не превращая его в массив? Как можно просматривать этот пул? Взять одну операцию, посмотреть, может ли она быть выполнена, взять следующую и т.д.? |
Цитата:
|
Цитата:
|
Цитата:
1. Если участников операции нет в buffer - добавляем в него и выполняем. 2. Если хотя бы один из участников есть в buffer, то делаем setTimeout() и пробуем до тех пор, пока не получится как в п.1 Причем это можно сделать как на стороне сервера, так и на стороне клиента. |
Цитата:
А пул - простой список. Пришедшие операции добавляются в конец. Есть два события: 1 - операция добавилась 2 - какая то операция выполнилась. По каждому из этих событий мы просматриваем очередь от начала до конца. Если какая то операция может быть выполнена, то она отправляется на выполнение. Опять же все завит от условий. Если в пуле десятки записей, то и массив с операциями push и splice будет прекрасно работать. Это внутренние хорошо оптимизированные операции. |
Цитата:
В 99% случаев для каждого участника операции будет свободное место в buffer. А если и не будет - то оно очень скоро освободится. |
Часовой пояс GMT +3, время: 22:27. |