Как реализовать сопоставление между вкладчиками и получателями, используя Node.js? - PullRequest
2 голосов
/ 13 января 2020

У меня есть требование микросервиса механизма сопоставления для моего приложения, мне нужно реализовать сопоставление между вкладчиками и получателями. Итак, все данные вкладчиков и выводов хранятся в redis cache . В этот микросервис поступит множество запросов, которые будут помещены в кэш redis. мне нужно соответствовать на основе одинаковых сумм .

1) Как выполнить сопоставление, нужно ли мне извлекать детали из кэша в два отдельных массива и выполнять сопоставление для этих двух массивов. Итерация с обоими массивами, это правильный способ сделать это?

2) Поскольку и когда выборка данных в массивы становится больше, сопоставление становится сложным и займет много времени. Как лучше подходить к этому сценарию?

 Consider the following scenario:-

 w/d     |w/d amt|w/d-bonus|d/p    |  depositors   
 personA |10000  |   100   |person1|     70000
 personB |50000  |   750   |       |      
 personC |20000  |   100   |       |
 personD |1000   |   50    |       |
 personE |100000 |   1000  |       |

here person1 will be matched first with personB (50K -50K), personB is completely matched hence he will give person1 750 amt as bonus to depositor.

now still 20k of depositor has to be matched. so, that will be matched with personE , since personE got only 20K (personE needed 100K) he will give only 200 amt (for 100K we have 1K bonus then for 20K bonus will be 200/- amt)as bonus to depositor.

Point to be noted:

1) person1 is first matched with personB then he is matched with personE.

2)person1 could have matched totally with personE but person1 would get less bonus that is 700/- amt.

3)but now since person1 is matched with personB and personE , person1 will receive total bonus of 950/- amt 

Main aim is to provide depositor a maximum bonus.

above is an example , the perfect match would be D,B,A,E and D,B,E
we will consider D,B,A,E since we can satisfy 4 withdrawers and yet 
give the depositor maximum bonus. 

here: 
w/d => withdrawer
d/p => depositor
amt => amount

1 Ответ

0 голосов
/ 19 января 2020

Сохраняйте отсортированный набор с элементами вывода, используя в качестве оценки bonus ÷ amount.

Для

w/d     |w/d amt|w/d-bonus
personA |10000  |   100   

Вы сохраняете его, используя ZADD :

ZADD withdrawers 0.01 "personA|10000|100"

Затем вы используете ZPOPMAX , чтобы получить и удалить верхний элемент. Или вы можете использовать ZREVRANGEBYSCORE , чтобы получить то же самое, не удаляя, как показано ниже:

ZREVRANGEBYSCORE withdrawers +inf -inf WITHSCORES LIMIT 0 1

При обработке вывода с помощью ZPOPMAX, если совпадение является частичным, тогда вы ZADD снова с уменьшенной суммой и бонусом.

Если вы обслуживаете своих вкладчиков в порядке очереди, используйте список для постановки их в очередь: LPU SH для постановки в очередь, RPOP для обработки.

При обработке вкладчика, если совпадение является частичным, вы RPUSH делаете это с уменьшенной суммой.

Ваш клиент для сопоставителя может использовать блокирующие версии команд для использования: BRPOP для вкладчиков и BZPOPMAX для снимающих.

Но если у вас есть несколько двигателей, выполняющих матчи, вам лучше провести весь матч, используя Lua скрипт для атомарности. Сценарий должен выскочить из обеих очередей, если ни одна не пуста, pu sh вернет любую обновленную запись, частично сопоставленную, а затем вернет результат сопоставления, если он есть (nil, если очередь пуста), чтобы вы могли обработать ее: сохранить ее, выполняйте его, что бы вы ни делали.

Изначально мы говорили, что для снятия средств score = bonus ÷ amount, чтобы максимизировать бонус для вкладчиков. Но это оставляет случайным образом, как разрешить связи в счете (сначала вы получите лексографически отсортированную максимальную запись).

Есть много решений для этого.

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

счет = раунд (бонус * 1000000 ÷ сумма) + 1 ÷ сумма

При округлении вы рассматриваете техническую сумму ie диапазон bonus ÷ amount. Размер этого диапазона определяется обратным множителю. Здесь 1000000 делает этот диапазон размером 0,000001.

Или вы можете просто сделать ZREVRANGEBYSCORE withdrawers score score, чтобы получить все элементы в ie вверху, после вызова ZREVRANGEBYSCORE withdrawers +inf -inf WITHSCORES LIMIT 0 1, чтобы получить максимальный балл. Затем вы разрешаете t ie на стороне клиента.

Или вы можете попытаться использовать лексикографическое свойство отсортированных наборов, настраивая способ хранения элементов.

...