Построение функциональной абстракции над удаленным выполнением кода - PullRequest
0 голосов
/ 12 мая 2018

В настоящее время я сталкиваюсь с проблемой абстрагирования удаленных вызовов методов (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?

Знаете ли вы о более простом функциональном подходе, который позволяет достичь чего-то сопоставимого?

...