
Ayrat
28.06.2018
11:58:16
Помойка, да. Я старался этой помойкой не пользоваться. Это как в C# везде dynamic пользоваться. Чувствуешь себя богом в компайл тайме пока не выходишь в рантайм.
Евентстрим такая же фигня. Кажется хорошей вещью, но
но помойка)
Я там логи гонял кастомные и технические сообщения

Vasily
28.06.2018
11:59:17
Значит, буду продумывать структуру, что с чем должно взаимодействовать

Google

Ayrat
28.06.2018
11:59:36
Теоретически можно поднять отдельную актор систему и соединить их друг с другом. У каждой актор системы будут свои евент стримы
Но лучше так не делать

Pavel
28.06.2018
11:59:56

Vasily
28.06.2018
12:00:07
Вот и я о том
ПОходу, тут кода много не надо писать, а надо много думать

Pavel
28.06.2018
12:00:36
да, и это здорово

Ayrat
28.06.2018
12:01:39
ну вообще вот идея с отдельными актор системами работает, но я ей не пользовался.
Там в акторпути имя системы учитывается, так что роутинг будет работать даже между акторами разных актор систем

Roman
28.06.2018
12:03:31
И все же в акке смущает, то что сообщение может не дойти, а хэндлить это надо через прослушивание dead letters

Vasily
28.06.2018
12:04:33
ПОка не могу понять, как от аска избавиться
ВОт есть соединение с сервером
В теории это отдельный актор, который дает коннекшн агенту
Есть актор, который отправляет и получает сообщения
А, я понял

Google

Roman
28.06.2018
12:05:48

Vasily
28.06.2018
12:05:52
Ептыть
В верхнем акторе вводится месседж, который менеджит стейт

Ayrat
28.06.2018
12:10:12
ПОка не могу понять, как от аска избавиться
Актор А отправляет сообщение ЗАПРОС Актору Б и переходит в сосотяние ОЖИДАНИЯ, в котором он принимает только сообщения вида ОТВЕТ. Все остальные, например, игнорит, или стешит. Тебе решать. Но главное что он на них реагирует! (а не висит на аске).
Актор Б получает сообщение ЗАПРОС, и формирует ОТВЕТ, который засылает обратно по адресу Sender.
Актор А который всё это время был доступен получает ОТВЕТ, реагирует на него и переходит обратно в состояние АКТИВЕН, в котором сообщения обрабатываются обычным образом. Ранее принятые сообщения (в режиме ожидания) если он их сташил, можно вывалить в мейлбокс и таки обработать, а можно новых подождать


Pavel
28.06.2018
12:10:30
Не понимаю в чем сложность. Актор который отправляет запрос на данные ожидает получения сообщения с ответом. Актор который отвечает за бд получает сообщение с запросом, идёт в бд и отправляет сендеру новое сообщение с ответом (которое ожидает сендер).
А, да, вот Ayrat выше все подробнее описал

Vasily
28.06.2018
12:10:59
Сложность в том, чтобы это осознать
А так все ок

Ayrat
28.06.2018
12:11:39
Во время режима ожидания можно на все вопросы отвечать сендерам "занято, идите нахер".

Vasily
28.06.2018
12:12:27
Кстати, в akka.fsharp become есть?

Ayrat
28.06.2018
12:13:10
Это очень круто когда у тебя есть гигантский кластер доменной логики и ты на любой запрос вместо мучительных ожиданий (а если ты наговнокодил всё на ask, то могут быть глубокая вложенность этих асков), сразу получаешь вменяемый результат, например - БД занята, или там - нехватает бабок, или ещё что

Vasily
28.06.2018
12:13:34
А, ну так и делаю
В общем-то

Ayrat
28.06.2018
12:13:47
ну для ФП это и есть оно.
Become это костыль для ООП
у нас вот большая акка хрень на любой запрос давала за 20мс ответ. Мы метриками всё обвешали и ни один мессадж от входа до выхода не жил более 20мс.
В начале у нас было много ask, потом ловили проблемы неполучения ответов, потом повешали таймауты, стали ловить сраные таймауты, потом мы нашли все аски и выжгли их огнемётом.
Система моментально стала офигенной.

Evgeniy
28.06.2018
12:22:47
https://github.com/Horusiath/Akkling/blob/master/examples/basic.fsx#L66-L69

Google

Vasily
28.06.2018
12:25:10
Это видел
В акклинге настораживает то, что придется много кода читать
Исходного

Evgeniy
28.06.2018
12:25:46
Его там немного.

Pavel
28.06.2018
12:30:23

Evgeniy
28.06.2018
12:34:44

Pavel
28.06.2018
13:12:33
так вроде ж несложно обернуть ActorReft в какой-нибудь TypedActorRef<'T>

Evgeniy
28.06.2018
13:14:17

Pavel
28.06.2018
13:16:40
не за чем

Vasily
28.06.2018
13:47:09
Чет не пойму, как в один актор засунуть несколько типов месседжей
Через ?: ?

Ayrat
28.06.2018
13:47:48
В оригинале так и делается. Но можно DU, ща
в оригинале это в смысле сама AkkaNet

Vasily
28.06.2018
13:48:02
А если без DU

Ayrat
28.06.2018
13:48:21
Если без DU, то только кастом конечно же
А чем тебя DU не устраивает?

Vasily
28.06.2018
13:48:56
Я ща пытаюсь понять, как мне, например, стейты менеджить

Ayrat
28.06.2018
13:50:17
замыканиями,
let actor ... =
let mutable state ... =
let loop () = actor {
... // здесь принимаем месаджи, меняем state
}
loop ()
можно так. в mutable нет ничего страшного, т.к. актор синхронный.
Если не хочется mutable , пихай стейт в аргументы loop

Vasily
28.06.2018
13:50:28
У меня получается что-то вроде Repository=|Init|Find|FindOne|Update

Google

Vasily
28.06.2018
14:00:37
Как в akka.fsharp прописать beforeStart?
Типа создание и посылка месседжа передвозвратом ссылки на актор?

Ayrat
28.06.2018
14:02:36

Vasily
28.06.2018
14:17:13
Пичалька
Придется вводить фейковую инит функцию

Roman
28.06.2018
14:18:34

Ayrat
28.06.2018
14:19:12
Ну вообще всяких там onRestart и PostStop евентов в F# акке не хватает.
Если чо, в F# всегда можно по-старинке сделать type ... = inherit ActorBase и т.д.

Vasily
28.06.2018
14:20:19
Так неинтересно, но, возможно, придется
Чую, репозитории все же придется делать мейлбоксами обычными

Ayrat
28.06.2018
14:49:53
Как и зачем тебе могли потребоваться обычные мейлбоксы??

Vasily
28.06.2018
14:50:09
Ну стейты хранить, синхронизировать доступ

Ayrat
28.06.2018
14:51:07
Чем акковский мейлбокс отличается от F#??? это та же очередь + рекурсивная функция обработки.
И там, и там стейт делается одинаково
не понимаю

Vasily
28.06.2018
14:51:27
Смотри
Есть следующий сценарий
Из внешнего канала запрашивается список с некоторой контрольной суммой
Если контрольная сумма совпала, нам придет пустая коллекция, и ничего не надо делать
Если нет, то надо обновить коллекцию в базе

Google

Vasily
28.06.2018
14:53:28
Тем, что пришло

Ayrat
28.06.2018
14:53:49
Допустим

Vasily
28.06.2018
14:53:51
Контрольные суммы для разных типов хранятся в отдельном репозитории
Точнее, в моей случае в отдельной коллекции dblit
dblite
litedb

Ayrat
28.06.2018
14:54:50
очень допустим

Vasily
28.06.2018
14:55:10
Вот вопрос, как это в акторы засунуть

Ayrat
28.06.2018
14:55:50
Так же как в мейлбоксы?)
Ну т.е. серьёзно, почему ты не можешь сделать так же

Vasily
28.06.2018
14:56:03
Там у меня есть PostASync

Ayrat
28.06.2018
14:56:16
ну а тут Send
неблокирующий

Vasily
28.06.2018
14:56:32
Тьфу, PostAndREply

Ayrat
28.06.2018
14:56:48
ну а тут mailbox.Context.Sender
mailbox.Context.Sender.Tell ReponseMessage
ты всегда знаешь кто тебе прислал конкретный мессадж

Vasily
28.06.2018
14:57:35
Теперь у меня следующие шаги:
1. ПОлучить crc для конкретного типа из базы
2. Отправить серверу сообщение
3. На основании ответа сервера обновить crc\коллекцию определенного типа в базе
Получается, что мне нужно делать последовательное flow из акторов

Ayrat
28.06.2018
14:59:39
Да, и это нормально
Акторы для опроса бд, акторы с логикой, акторы роутеры и т.д.