![]() |
Нашел более менее оптимальный вариант, проектирование систем на основе акторов, в java.
Для простоты и прозрачности, логики, все поведение програмируется внутренними классами. Реализовал базовый набор по Hewitt-у, во время обработки сообщения, актор может: - отправлять сообщения другим акторам и самому себе(рекурсивное сообщение) (метод Context.send и Reference.send) - менять свое поведения (метод Context.become) - создавать других акторов (метод Context.create) О поведении актора, на основе просто примере будет более наглядно: Цитата:
Если расширить данный пример, можно реализовать актор для сервера авторизации. Замечание: если пришло сообщение, которого нету в заданном поведение, то метод для обработки сообщения ищеться в базов классе. В данном примере, если отправить сообщение logout, когда актор установлен как Free, будет вызван обработчик из базового класса Account, на экран консоли, выведиться сообщение "wrong logout" Пример использования: Цитата:
|
- Добавил отправку сообщений с задержкой
Цитата:
- print с задержкой 1сек - tick без задержок оба сообщения рекурсивны. На каждое сообщения tick, увеличивается счетчик, на каждое сообщения print отображается показатель счетчика и затем сбрасывается на ноль. Заложил сетевой фреймворм, на основеjava.nio. Для простого примера реализавал, ехо сервер. |
Обновил. "немного" переделал код. Интерфейс остался обратно совместимый. Исключение запросы.
- добавил полный цикл обслуживания актора create/stop/resume/terminate(kill). При остановке, возврате или удаленния актора, можно устанавливать,обратный вызов, функция которая будет вызвана, в случае успешной операции. Примечани: Функции обратного вызова должны быть определенны в классе актора. |
Управление запросами
Для запрос к другому актору, нужно объявить класс-поведение, и задать методы с возможной сигнатурой ответа. При вызове метода request, возвращается объект Future, в котором черем метод handle, нужно указать имя поведения, для обработки ответа. Внимание: если не указать поведение, то запрсов не выполниться. При ответе, актор может получить сообщения типа reply или complaint, в классе-поведения обрабатывающий запрос, нужно покрыть возможные варианты сигнатуры сообщения. Пример: Есть актор Account, в котором присутсвует медот-обработчик login. При обработке сообщения, если данные логина и пароля, соответсвует данным аккаунта, то Account отправляет объект LoginSuccess, если не правильные данные, то отвечает через метод complaint, отправляет LoginFail.WrongLoginOrPassword. Цитата:
В примере показывается, что вовремя запроса, актор будет обрабатывать, только ответ. Другие сообщения обрабатываются после запроса, то есть актор блогируется для обработки входящих сообщения, за исключение ответа на запрос. Цитата:
[QUOTE="Спойлер"] [COLOR="#363940"] 0 E AccountRequest |
- Переделал сетвой API. Реализовал пример эхо сервера.( Соединение отправляет каждые 100 мс строку, сервер читает её отображает на консоль и отправляет обратно, клиент читае и отображает на консоль)
- Переместил сетевой API в репозиторий ядра. - Добавил методы для определения типа сообщения(запрос, ответ, ответ-ошибка) |
Обновил:
- реализовал цепочку запросов - реализовал передачу запрос(continuation) - реализовал управляющие методы статическим путем, объявленны в fact.ActorContext. Теперь можно получить доступ к управляющим метода чере import static Добавил соответствующие примеры |
Исправиль некоторые ошибки.
Немного lineage. Написал каркас для сервера авторизации.(interlude) Нужно организовать - работу с базой данных - работу с игровыми серверами. Написать, proxy для игрового сервера. - переписать сетевую библиотеку, организовать чтение по требованию. ПС: Для меня не понятно, каким образом работает реализация, криптографии, добавление контрольной суммы и шифровка первого пакет xor ключем. Отсутвует смешение, для задания предела, самое интересное, если подать буффер в котором, уже записанно, минимум 4 байта, то криптография накроется медным тазом. У меня закрались дикие сомнения, что реализация на l2j, если её топорным путем перенести на С не будет работать, так как в jvm зануляет все значения в созданных массивах. Понятно, что в сервере авторизаии, может быть только один пакен на запись и один на чтение, по протоколу, но это всеравно не делает менее ужасней эту криптографию. Не могу понять почему выдает ошибку контрольной суммы, переодически... магия... ПС Двойная авторизация, в l2j вообще кабздец, как так можно было сделать. Ошибка, котороя тянется на все сборки |
[OFF]Тема одного актёра?[/OFF]
|
[OFF]
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
у меня закралось чувство, что никто, в этой теме отписавшийся, не шарит в теме а все заинтересованные в процессе изучения и творческих мыслях
|
[OFF]Вообще ничего не понял
Умный дядька видать)[/OFF] |
https://dspace.mit.edu/bitstream/han...pdf?sequence=2
Kilim https://pdfs.semanticscholar.org/5ca...38cb673aa2.pdf actor foundary ПС Пару программок c использование akka и оно вставит Оно просто не на той стадии, на которой может пользу принести. Мне надо написать для отладки библиоткеу, покрыть все тестами, мануалы сделать и тогда можно будет, что-то понять, а так только для тех кто в теме. Вот когда сделаю кластерную систему, горячую замену кода актора, тогда будет весело. По сути можно будет обновить код сервера не перезагружая его. |
просто непонятные каракули
|
[OFF]Он с другой планеты, отвечаю! [/OFF]
|
Немного рассуждений.
Все в реализации мучает, несколлько проблем. Первая проблема. Проблема точки входа, как не крути точку входа приходится реализовывать костылями. Суть проблемы, в том, что вычисление в модели происходит путем обмена сообщениями и их обрботки, у каждого сообщения, есть активурующее, то сообщения, в момент обработки, было сгенерированно, а первое сообщения в системе не имеет активурующего. Это как проблема физики, модели акторов получила вдохновения от туда и проблемы, зарождение вселенной. Была ли вселенная самого начала, был ли большой взрыв? Это же все точка входа, для вселенной... Все физики, ищут точку входа для вселенной. Вторая проблема. Проблема связей. Один из самых мощных механизмом, по моему. Просматривая различные реализации, не нашел реализацию данной части, хотя она очень важная. Обычно реализовывают принцип обмена сообщениями, а остальное упрозняется. Суть в том, что с какими актором, можно взаимодействовать. Согласно Хьюитту, актор может взаимодействовать с акторами, которые он знает. Актор может запоминать, другие акторы, которые отправили ему сообщения или были получены, их ссылки, путем сообщения. Если не углублятся в теорию, первые связи, которые доступны при обработки - это связь самим собой и отправителем сообщения(метод контекста self() sender()). Нужен очень мощный механиз для обслуживания связей. Если посмотреть на реальный мир, то есть Вы, как актор и человек далеко от вас, где-то на Марсе, все ваши взамодействия, физичкие, можно интерпертировать обменом сообщений в модели. Вы никаким путем не можете взаимодействовать, физически, с человеком на марсе. Так как вы не знаете о нем, вы слышали, но не можете наблюдать его действия, и получать влияние от них. Так же можно и в la2, вам не интересен человек на другом конце карты, так как вы взаимодействуете с ближайшим окружением. |
Добавил sbt сборку
Прикрепил текущий билд fact-0.1.jar Кто хочет может попробовать, для любителей хардкорва. Вот примеры. позже напишу мануал к использование и к разработке, с теоретической базой. Участники форума, могут предлагать различные примеры прогамм, а я их реализую в рамках модели актора, с помощью библиотеки. |
Спасибо за ваш труд
|
Rework 0.1.2
- Расширил типы сообщения, добавил системный тип - Реализовал define как системное сообщения - Реализовал приостановку(stop) актора как системное сообщения - Реализовал востановление(resume) актора как системное сообщение - Реализовал убийство(terminate/kill) актора как системное сообщение - Переработал базовый алгоритм request-reply-complaint |
Rework 0.1.3
Переделал внутренний алгоритм для fact.Record. Жизненный цикл актора Цитата:
|
| Время: 17:18 |