
Vasily
28.06.2018
15:01:18
Вот как выглядит актор для опроса бд, интересно

Ayrat
28.06.2018
15:02:24
получил доменный месадж, замапил его в SqlCommand, вызвал асинхронный запрос БД, вошёл в состояние - "отъебитесь, я занят", задаче на вызов бд в колбек повесил отправку себе пробуждающего сообщения, которое иницирует посылку ответа

Vasily
28.06.2018
15:03:12
Посылку кому, вот в чем вопрос

Ayrat
28.06.2018
15:03:20
context.Sender

Google

Ayrat
28.06.2018
15:03:31
ВОзможно тебе стоит почитать про Акку)

Vasily
28.06.2018
15:03:36
Что сендеру, понятно

Ayrat
28.06.2018
15:03:50
Тогда непонятно что тебе непонятно
Если ты знаешь кто тебе послал запрос, шли ему ответ. Если надо послать кому-то другому, пусть запрашивающий в месадж вкладывает другой адрес

Vasily
28.06.2018
15:05:47
Ну вот есть у меня некий CheckStateActor, который должен выполнить n шагов
У каждого шага разные типы сообщений
Которые актор принимает\посылает

Ayrat
28.06.2018
15:07:21
Назови его DbActor, который владеет конектом к БД.
Допустим принимает месаджи Create Id, Delete Id
Вот он принял Create 123, забацал из него INSERT INTO ... VALUES (123)
вызвал conn.ExecuteAsync command
подождал асинхронно, отправил отве сендеру
это если ты хочешь побыстрее закодить, но обработка сообщений заблочится
в твоём случае это может быть некритично

Vasily
28.06.2018
15:07:46
У меня не sql, но это неважно
Пока у меня получается, что в акторе должно быть несколько очередей обработки сообщений

Ayrat
28.06.2018
15:09:15
т.е. будет типа
actor {
let! msg = mailbox.Receive()
match msg with
| Create x ->
let sqlCommand = ...
let! response = connection.ExecuteAsync sqlCommand
context.Sender.Tell response
| Delete id -> ...

Google

Vasily
28.06.2018
15:09:29
Это я понимаб
ПОнимаю
Тут вопросов нет

Ayrat
28.06.2018
15:09:54
Тогда я уже что-то явно не понимаю)

Vasily
28.06.2018
15:10:18
По факту я сначала должен получить crc
Из одного актора
Перейти в стейт отправки сообщения
Отправить сообщение в другой актор
Обработать ответ

Ayrat
28.06.2018
15:11:09
Окей, есть такой паттерн в ынтерпрайзых - saga, он же процесс манагер,
Сделай актора отвечающего за шаги логики и инфраструктурных, тупых
один инфраструктурный всегда опрашивает crc, другой умеет с БД, третий логи в эластик складывать
актор за логику пусть ведёт какой-то процесс (конкретный или глобальный это я уж хз) и да у него будут стейты шаги, где он будет по очереди спрашивать чо как у других акторов

Vasily
28.06.2018
15:12:39
А как он будет от них ответы получать, если без ask?

Ayrat
28.06.2018
15:13:07
Каждое состояние характеризуется типами принимаемых ответов

Vasily
28.06.2018
15:13:16
Таааак
Теперь вопрос
Как это все внутрь одного актора засунуть?

Ayrat
28.06.2018
15:13:44
т.е. в одном состоянии мы реагируем только на месадж CrcResponse, а в другом уже на DbResponce
в DU запихни и всё

Vasily
28.06.2018
15:14:23
Это подводит к необходимости создания акторов - конвертеров сообщений

Google

Ayrat
28.06.2018
15:15:27
состояния вынеси в несколько рекурсивных функций
типа
let waitingForCrcLoop () = actor{
let! msg = receive
match msg
| CrcResponce resp -> return! processResponseLoop resp
| _ -> return ()
}
и кидайся этими функциями туда сюда чтобы ходить по стейтам

Vasily
28.06.2018
15:16:15
processResponseLoop тоже actor возвращает?

Ayrat
28.06.2018
15:16:20
ага

Vasily
28.06.2018
15:16:37
О чем-то таком я думал, да
Там же надо мейлокс прокидывать в параметры функции, так?
мейлбокс

Ayrat
28.06.2018
15:18:14
при этом стейт между этими лупами можно просто в общее замыкание мутабельное повесить,
let mutable state = ...
let startLoop() = actor {
...
}
let loopTwo() = actor {
...
}
let finishLoop() = actor {
...
}
startLoop()
не, ты можешь это делать в общей функции
let createSuperActor mailbox =
let mutable state = ...
le t startLoop() = actor {
...
}
let loopTwo() = actor {
...
}
let finishLoop() = actor {
...
}
startLoop()

Vasily
28.06.2018
15:19:11
А, точно

Ayrat
28.06.2018
15:19:41
это всё будет один актор с тремя состояниями и общим шаред стейтом, который можно смело делать мутабельным и не трахать себе мозги перекидыванием в ФП стиле этого стейта по функциям

Vasily
28.06.2018
15:20:39
Да, так сработает
Выхожу на новый уровень :)

Ayrat
28.06.2018
15:21:30
стикер ужасен)
В скале это в тыщу раз лучше выглядит

Vasily
28.06.2018
16:11:02
Aether.lenses

Ayrat
28.06.2018
16:11:21
Ну да, знаю. Но там тоже надо обмазать этот рекорд тайп линзами
Я к тому что в скале есть языковая поддержка для линзового синтаксиса

Vasily
28.06.2018
16:15:34
Кстати

Google

Vasily
28.06.2018
16:16:38
Как мне гарантированно перейти в стейт прослушивания дочернего актора до отправки ему сообщения,ответ на которое я хочу слушать?

Ayrat
28.06.2018
16:17:04
А какая разница?

Vasily
28.06.2018
16:17:39
Ну разница в том , что в теории я могу отправленное сообщение потерять
Т.к. принимающий актор будет не в том стейте
Отправляю сообщение из одного стейта, слушаю в другом

Ayrat
28.06.2018
16:18:45
Можно пример, я пока не понял
Это понятно

Vasily
28.06.2018
16:19:36
Т.е. стейт я переключаю не при приеме ответа

Ayrat
28.06.2018
16:19:46
при отправке, да

Vasily
28.06.2018
16:20:00
А при отправке tell
Я так понимаю, в данном случае поведение недетерменированно

Ayrat
28.06.2018
16:20:50
Да)
Ну т.е. сообщение может упать в дед летерс и всё.
И молодая не узнает какой у парня был конец

Vasily
28.06.2018
16:21:53
Вот и я о том

Roman
28.06.2018
16:24:01

Vasily
28.06.2018
16:24:34
Глянуть на орлианс,шоле
Хотя у него под f# ничего нет

Roman
28.06.2018
16:25:01

Google

Roman
28.06.2018
16:25:16
Ну и из коробки он тоже норм работает
Но у него другое строение и обязательно есть клиент и сервер. У тебя же больше одноранговая сеть получается

Ayrat
28.06.2018
16:26:20
Да это не проблема, хочешь детерминированности context. System.Sheduler.TellOnceCancellable себе зарядил на всякий случай и все.

Roman
28.06.2018
16:26:21
Там акторы в облаке только.
Ааа

Ayrat
28.06.2018
16:26:48
Это если у тебя система с отказоустойчивостью овер 9000 нужна

Roman
28.06.2018
16:26:51
Понял будет слать пока ты не ответишь что получил

Ayrat
28.06.2018
16:28:15
Не, я имел в виду отправил сообщение, ожидаешь или ответа или сообщения от шедулера через какой-то интервал времени о том что ответ не пришёл. Это как таймаут в аске, но быстрее.

Roman
28.06.2018
16:28:20
А потом в орлианс появился eventsourcing и стало жить легко

Ayrat
28.06.2018
16:29:27
Да не надо же, только на ремоутинг.

Roman
28.06.2018
16:29:43
Так у тебя и локально сообщения могут не дойти
Ну и если используешь cluster.sharding то там хз где локально где нет будет.

Ayrat
28.06.2018
16:30:23
Актор пасы типизируешь и избавляешься от промахов по адресу. Всех акторов делаешь реактивными и избавляешься от таймаутов ин процесс

Roman
28.06.2018
16:30:46

Ayrat
28.06.2018
16:30:50
Откуда ещё взяться отсутствию ответа?
Ток с работы ушёл, завтра гист скину.

Vasily
28.06.2018
16:32:54
Короче, чует мое сердце, что я ступил на охуенно тонкий лёд

Roman
28.06.2018
16:32:55
Ок, буду благодаркн