This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2015-12-02
Channels
- # admin-announcements (29)
- # aws (11)
- # beginners (247)
- # boot (11)
- # business (1)
- # cider (73)
- # clara (5)
- # cljs-dev (37)
- # cljsrn (29)
- # clojure (86)
- # clojure-dev (9)
- # clojure-indonesia (1)
- # clojure-italy (3)
- # clojure-nl (1)
- # clojure-russia (195)
- # clojure-sg (2)
- # clojure-uk (3)
- # clojurecup (1)
- # clojurescript (296)
- # clojurex (2)
- # code-reviews (6)
- # core-async (3)
- # cursive (33)
- # datavis (9)
- # datomic (11)
- # funcool (31)
- # hoplon (1)
- # ldnclj (8)
- # lein-figwheel (5)
- # leiningen (5)
- # luminus (4)
- # off-topic (3)
- # om (172)
- # onyx (13)
- # re-frame (5)
- # reagent (84)
oxgrouby: осторожнее, слышал про эффект бабочки?
Кто-нибудь может проконсультировать по использованию очередей? У меня в приложение есть задача -- рассылка почты. Формат письма один и тот же, и есть несколько функций которые производят эти письма и сохраняют их в очередь. И у этой очереди есть один отдельный поток-потребитель который забирает из неё письма. Вопрос: как правильно инициализировать этого потребителя? Ну то есть хотелось бы чтобы это был какой-то управляемый поток, подчинённый какому-нибудь пулу и т.д. (я в пулах и executors ноль, почитал бы сурцы).
на самом деле, у меня есть ещё несколько таких мест, где надо потребителя как-то управляемо инициализировать.
turtle: сейчас посмотрю примеры и вернусь
turtle: То есть мне надо обернуть очередь в агента, и с помощью посылаемых функций и параметров туда добавлять элементы. А как управлять вытаскиванием и отсылкой?
Т.е. кто будет посылать агенту функцию send-email-from-queue
?
ну агент же сам себе очередь, ты в него засылаешь функцию, он ее выполняет. Если в момент отправки занят, то выполнит ее как доберется
ну в агент надо что-то положить же?
а вот кстати практический вопрос - как с такой очередью переживать рестарты? получается все равно придется сделать сторадж job с параметрами функции и остальным хламом? чем тогда лучше standalone очереди?
ну да, только почему так выходит то? агенты кул, но на практике надо делать как делают
естественно, если хочется, чтобы ничего не проебалось, то нужно немного по-другому подходить к вопросу)
@nicola: я сейчас так уже делаю, я хочу управление этим отдельным потоком отдать на аутсорс какому-нибудь экзекутору.
Ну он же может умереть.
@ognivo: ну вот, получается реальный ответ на вопрос про рассылку это второй ответ Коли, а не первый 😕
Да, я так и живу
Но хочу идиоматично
на деле общаться через агентов с внешним миром довольно стремно, внешний мир недружелюбен
второе применение агентов, это io после STM транзакций - Agents are integrated with the STM - any dispatches made in a transaction are held until it commits, and are discarded if it is retried or aborted.
У меня сейчас это всё внутри приложения на ztellman/lamina
, и там даже есть какой-то executor, но я пока не добрался до него.
Агенты то понятно как использовать, вопрос по правильному управлению потоком-потребителем скорее.
Меня смущает что я его сам создаю, да ещё и с коленочным решением вида try catch
а создание новых потоков?
Просто у меня получается по монолиту размазано это создание потоков, как-то не оч.
Не, не поллю. Просто создаю отдельный поток, и он висит до поступления новых элементов в очередь.
В lamina
так можно.
Да. Но кстати, персистить тоже надо бы, это упущение моё.
Она аналог core.async, по-моему даже появилась до него.
Теперь автор её бросил, и написал новую библиотеку manifold
@gordon: @nicola вот кстати в связи с этой моей болью, которую вы кажется не понимаете или привыкли, есть идея - есть персистентные структуры - есть концепция event-sourcing которая впринципе может быть встроена в процессы типа swap - почему бы не симулировать persistent memory тем, что мы 1) заставляем писать миграции для данных в памяти 2) на время поднимаем второй экземпляр приложения 3) стримим поток событий на него 4) в момент, когда поток приостановился (т.е. мы балансером перестали пускать на конкретный сервер) - состояние в какой-то момент времени должно совпасть 5) выключаем старый инстанс, запросы идут на новый значимый плюс этого как мне кажется - возможность программировать не усложняя архитектуру, просто полагаясь, что у нас persistent memory возможно я пропустил и это есть или имеет фатальные недостатки?
Я планирую переезжать с lamina на manifold или core.async. Но кор.асинк мне не нравится в плане его нотации со стрелочками и т.д. К этому надо привыкать, видимо.
@nicola: да, фактически. но проблема в том, что каждый раз надо думать о настоящей персистентности данных в памяти, почему бы не снять эту сложность совсем для конечного аппа (сделать глобально)?
@nicola: видел https://github.com/alandipert/enduro? я о том же только глобально
@razum2um: беться человечество над этим - http://avout.io/ тудаже
@nicola: а с персистентностью что заюзать? Redis, RabbitMQ? Редис уже стоит и подключён, я там сессии храню.
базы пока привычней и интероперабельней для большинства, пока хватает производительности
спасибо, сэр.
Вон даже какаято либа есть - https://github.com/ptaoussanis/carmine
я пробовал, она ок, но вот это и есть accidental complexity архитектуры, а еще кроме avout?
@nicola: у меня через неё сессии и работают, дальше не изучал.
@razum2um: спасибо за инфу про паб-саб.
убирает разделение между оперативной и перзистетной памятью https://en.wikipedia.org/wiki/HP_Labs#The_Machine
> стейт в базе? датомик? - атом который переживает рестарты зачем мне это? оперативная память не просто так появилась, она в тысячу раз быстрее
@prepor: так смотри выше. event-sourcing должен спасти. у тебя будет все в оперативе. всегда (пока ты сам этого хочешь и сколько хочешь)
> @prepor: так смотри выше. event-sourcing должен спасти. у тебя будет все в оперативе. всегда ну и что ты будешь делать если твой процесс сдохнет просто? )
@prepor: берем начальное состояние (дампится или снапшотится раз в ..) и “догоняем” его
> @prepor Я больше про рассылку на redis
ну пабсаб вполне работает. только не скейлится (включая редис кластер). ну и carmine так себе либа
А ещё у меня с "детства" такая идея -- выбросить редис и юзать иннодб через HandlerSocket
, но я не знаю с чем я столкнусь в таком случае.
Да, к иннодб же можно напрямую обращаться через HandlerSocket, и возможно через Memcached Daemon (от Оракла)
эта тема с HandlerSocket вроде как уже несколько лет как протухла. ну оверхеда на sql парсинг и query planning не так много. а когда ты используешь prepared statements так нет и вовсе
А какие плюшки у редиса? Вообще, что почитать на тему фундаментальных различий между реляционными БД, редисами, КЗ-хранилищами, персистентными очередями?
например атомарные операции, протухание записей, блокирующий и неблокирующий интерфесы
> А какие плюшки у редиса? ооочень быстрый, транзакционное выполнение lua-скриптиков, вполне неплохой "stdlib" из разных структур данных
> The library comes with multiple APIs. There is the synchronous API, the asynchronous API рубишная и кажется скаловская (как минимум, что юзал) либы на нем построены, оно же асинхронное
от того что ты с сокетом на уровне клиента будешь общаться неблокирующе у тебя интерфейс работы с базой асинхронным не станет. т.е. ты не получишь ответ на запрос 2. до тех пор пока не получил 1.
@kamilogorek: > Вообще, что почитать на тему фундаментальных у Ричи в его списке книжек есть много про БД http://www.amazon.com/Clojure-Bookshelf/lm/R3LG3ZBZS4GCTH. Но я сам толком не читал так что советовать не могу )
@prepor: хорошего поста в блоге хватило бы.
я имел в виду, что написано достаточно, что мне показалось, что оно есть, пусть это и всего лишь ужимка сишного клиента
https://github.com/mp911de/lettuce например ломается при фейловере )
> лучше скажи, почему avout не торт? ну ооочень мееедленный распределенный stm тебе может быть нужен только для координирующих действий между серверами. типа выбора лидера, ребалансировки или еще чего-то подобного. и тут вроде как удобнее пользоваться голым ZK-интерфейсом (или библиотеками рецептов сверху него типа curator), чем вот такими конструкциями.
Ок, господа, спасибо, пойду теперь наконец всё пробовать. Наверно, сначала займусь экзекутором из manifold.
я ещё не знаю этого) А что с ним? Я просто использую aleph для http/websockets, он идёт вместе с manifold теперь.
Пока не знаю, сегодня планировал разведку боем. У меня есть рабочий функционал на lamina
, всё работает аналогично кор.асинку, насколько я понимаю.
да, я так и хотел сказать.
Есть производители которые суют сообщения в канал, и есть некие потребители которые на нём постоянно висят в ожидании новых сообщений.
Полагаю что в манифолде так же.
Сейчас ещё раз посмотрю core.async, но мне пока все эти стрелочки и подмигивания не нравятся)))
Или там есть обычные имена для операций?
суть то, конечно, не в этом. но сканируемость и понятность кода -- это одна из метрик проекта.
в общем давай, лучше подумай о семантике коннектов двухсторонних стримов друг с другом и на сколько ты хорошо понимаешь откуда и куда пойдет ошибка при ее возникновении. и как ты ее словишь
если для тебя так важны стрелочки / не стрелочки, то замени их в редакторе на что душе угодно, можно какую-нибудь емоджи подобрать годную
Ну в ламине есть огромный набор инструментов для каналов, вплоть до визуализации. Механика обработки исключений, соответственно тоже есть. С манифолдом посмотрим, могу потом отписать.
И усё. Как он доберётся, так выполнит, причём выделением потоков будет сам заниматься.
Но обработку ошибок нужно будет тебе всё равно делать, внутри try .. catch - от него не избавиться.
Стейтом может служить, например, количество отправленных писем. Тоже прикольно. Да и мало ли, любое, что нужно. Главное, чтобы функция его возвращала.
a.espolov: а это ты про кложа кап спрашивал?
Там Никита вроде ищет поанов в тиму
@ognivo: такую задачу ведь персистить надо. Нормальный и надежный способ сделать это на какой-нибудь nosql. монга+монгер - годный, рабочий вариант. Клэймер делает запросы в бесконечном цикле с таймаутом и тд. Такой способ надежнее и гибче любых других извращений.
а монга самое то - это хоть и недобаза, зато минимум возни и пара десятков строк кода на клаймер.
@turtle: так вопрос скорее в том, как грамотно инициализировать поток-потребитель. И у меня таких мест много. Поэтому действительно, или явишный тредпул (спасибо), или ещё какой.
@ilshad: спасибо за предложение, буду иметь в виду, если с паб-сабом у редиса не получится.
> ну и carmine так себе либа @prepor: а почему?
блокирующая, с эксплицитными пайплайнами, с имплицитным стейтом, на сколько я помню по-умолчанию оно все кодирует в свой формат, без возможности легко переключиться на json, скажем), что может оказаться неприятной неожиданностью.
@prepor: спасибо!