В настоящее время я сталкиваюсь с проблемой абстрагирования удаленных вызовов методов (RMI / RPC) в функциональной архитектуре, над которой я работаю.
Я использую язык программирования Scala, поэтому я неограничен чисто реализациями, но я хотел бы исследовать возможности и проблемы вокруг функциональной абстракции выполнения кода по сетевому соединению.
Что я ищу
- аннотация поверхвызовы удаленных функций
- объединяют вызовы удаленных функций, чтобы сформировать совместный обработчик для серверной стороны
map/comap
и серверные, и клиентские прокси-объекты
Мне интересны существующие подходы к этой проблеме, возможно, в Haskell.
Возможный подход
Поскольку я пока не нашел хорошего решения, я могу показать только некоторые идеи.
Класс типа для сериализации и десериализации в / из потоков байтов:
trait RW[T] {
def write(t: T, out: OutputStream): Unit
def read(in: InputStream): T
}
Черта Handler
используется сервером.Обработчику присваивается context
, который предоставляет информацию на стороне сервера, необходимую для обработки соединения (например, доступ к БД).Обработка соединения может привести к результату типа R
.
trait Handler[C, R]{
def handle(c: Context, in: InputStream, out: OutputStream): R
}
На стороне клиента вызов выглядит как обычная функция.
trait RemoteCall[A, B]{
def call(a: A): B
}
Теперь нужно определить удаленныйзвонки со своей логикой.Это может выглядеть так:
case class CallDef[A: RW, B: RW, C, R](f: (A, C) => (B, R))
extends Handler[C, R] with RemoteCall[A, B] {
…
}
A CallDef
определяет логику, которая должна выполняться на стороне сервера, указав функцию f
, которая принимает как данные клиента A
, так и контекст сервера C
.Он выдает ответ для клиента B
и результат для сервера R
, который можно использовать для обновления состояния сервера.Типы A
и B
должны быть сериализуемыми.
Это примерно столько, сколько я получил.Важной недостающей частью является то, как составлять различные CallDef
друг с другом, чтобы сформировать совместные обработчики, и как добавить некоторые дополнительные функции к типам, таким как экземпляры functor и monad.Таким образом, можно выразить более сложные вычисления, которые состоят не только из одного удаленного вызова.
Вопросы
Итак, знаете ли вы какие-либо существующие подходы, которые обрабатывают удаленные вызовы аналогичным функциональным способом, может бытьот Haskell?
Знаете ли вы о более простом функциональном подходе, который позволяет достичь чего-то сопоставимого?