erlang ets:update_counter

Aug 19, 2014 09:41

В книжках по erlang обычно рекомендуют использовать выделенный процесс по централизованное хранение данных. Это не всегда годится (не всегда удобно), когда к этим данным нужно обеспечить мультиядерный доступ на высоких скоростях ( Read more... )

erlyvideo, erlang, магия

Leave a comment

Comments 10

gliv August 19 2014, 06:16:44 UTC
Все потому, что lookup&delete - неатомарна (как одна операция).
Надо было сразу использовать update_counter, и не париться.

Не очень понятна логика с decrement_counter(): у вас в случае access=denied тоже сессия создается, но счетчик не увеличивается?

Reply

levgem August 19 2014, 06:19:43 UTC
Да.

access=denied означает что сессию мы держим какое-то время, но не разрешаем по ней. Это нужно, что бы нельзя было положить авторизационный бекенд. Он пишется на рельсах/пхп и в 100 раз медленнее.

Reply


sum_erman August 19 2014, 08:00:35 UTC
Вот пара ссылок на доклад с EF про concurrency в ETS: унылое видео
и слайды.

Reply


migmit August 19 2014, 08:19:42 UTC
Мнезию не пробовали?

Reply

levgem August 19 2014, 08:20:32 UTC
Пробовали. Нет, спасибо.

Очень сложно, неудобно, нельзя делать ram-only, всё равно на диске что-то остается.

Reply

demmonoid August 19 2014, 19:37:20 UTC
У моего знакомого брат от этой фигни умер.

Reply

gliv August 22 2014, 14:44:18 UTC
Хотел посмеяться, а потом подумал, а вдруг это не шутка! :)

Reply


ext_1637932 August 19 2014, 20:47:44 UTC
В update_counter мне сильно не хватило вот чего:
- возможности не делать ничего, если счетчик вышел за указанный предел
- возможности проверить что-либо перед обновлением

С одной стороны, все это можно было бы описать в сценарии «список операций, выполнять с первой по очереди, пока одна из них не окажется неудачной», а с другой - если реализовывать все хотелки, то получится очередной редис.

Алсо один генсервер с маленьким стейтом занимает 7 КБ памяти, и можно удариться в экстремизм «один юзер - один процесс» с регистрацией в gproc.

Еще у меня есть боль, связанная с неудавшейся организацией masterless очереди на ets/bag, но я не могу эту боль вербализовать из-за того, что писал код на грани своего владения предметом.

Reply


ext_3203501 June 26 2015, 00:46:55 UTC
А зачем сначала инкремент на 0 а потом декремент? почему просто не декремент?

Reply

levgem June 26 2015, 05:27:36 UTC
первая команда возвращает текущее значение, вторая возвращает новое.

Дальше мы можем проверить что было и что стало: была ли смена или нет.

Reply


Leave a comment

Up