@Fsharp_chat

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

но помойка)

Я там логи гонял кастомные и технические сообщения

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

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

Но лучше так не делать

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, то могут быть глубокая вложенность этих асков), сразу получаешь вменяемый результат, например - БД занята, или там - нехватает бабок, или ещё что

Кстати, в akka.fsharp become есть?
ага, верни другую функцию в LOOP ()

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
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
Как в akka.fsharp прописать beforeStart?
насколько я знаю никак.

Vasily
28.06.2018
14:17:13
Пичалька

Придется вводить фейковую инит функцию

Roman
28.06.2018
14:18:34
Придется вводить фейковую инит функцию
зачем? Ты же можешь начинать актор в статусе init, там делат ьвсе что нудно и переводить актор в статус working например

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
Да, и это нормально

Акторы для опроса бд, акторы с логикой, акторы роутеры и т.д.

Страница 620 из 772