поиск программной платформы с горячей заменой кода - PullRequest
4 голосов
/ 17 мая 2009

В настоящее время я думаю о том, как обновить программу во время ее работы. (Не во время отладки, это «производственная» система.)

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

Псевдокод

var method = typeof(MyClass).GetMethod("Method1");
var content = //get it from a database (bytecode or source code)
  SELECT content FROM methods WHERE id=? AND version=?
method.SetContent(content);

Сначала я хочу, чтобы система работала без сложности объектной ориентации. Это приводит к следующим требованиям:

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

С помощью .NET (и других) я мог внедрить класс через IoC и, таким образом, изменить исходный код. Но загрузка была бы громоздкой, потому что все должно быть в сборке или создаваться через Emit. Может быть, с Java это будет проще? Весь ClassLoader можно заменить, я думаю.

С помощью JavaScript я мог бы достичь многих целей. Просто оцените новую функцию (MyMethod_V25) и назначьте ее для MyClass.prototype.MyMethod. Я думаю, что можно также как-то отбросить функции с помощью "del"

Какая платформа общего назначения может обрабатывать такие вещи?

Ответы [ 8 ]

3 голосов
/ 27 марта 2010

Я думаю, что любой основанный на изображениях язык поддержал бы это. Я знаю, что это делает Common Lisp, поскольку это, вероятно, один из самых распространенных способов развертывания веб-приложений на Lisp, но я подозреваю, что он будет работать примерно так же, например, в Smalltalk.

3 голосов
/ 17 мая 2009

В Java у вас есть проект OSGi , который облегчает обновление и изменение модулей вашего приложения, не затрагивая другие модули.

Если вы не против изучения чего-то другого, язык программирования Erlang был разработан с нуля с учетом этого типа приложений.

2 голосов
/ 17 мая 2009

У меня сложилось впечатление, что сейчас Erlang очень хорошо виден как язык, обладающий такой способностью. Тем не менее, мой тесть (по моему мнению, главный программист) сказал мне, что он реализовал код с возможностью горячей замены на несколько более старой платформе - ассемблере для того, что они теперь называют z / OS (OS / 390 до этого ).

Лично я искал способы сделать это в пространстве Java, где в настоящее время выполняется большая часть моей профессиональной работы. В Джаваланде наиболее известной попыткой обеспечить горячую разгрузку (насколько я знаю) является работа, проделанная OSGi Alliance . Тем не менее, это решение обязательно включает в себя магию загрузчика классов из-за того, как устроены некоторые распространенные библиотеки Java (пример: JDBC DriverManager). Если вы решите пойти по маршруту OSGI, ваш код, вероятно, потребует обширного аудита и тестирования, чтобы гарантировать его пригодность для использования с архитектурой OSGi.

В качестве альтернативы реализации кода с возможностью горячей замены, возможно, вы могли бы реализовать систему, которая, по-видимому, обладает такой возможностью, используя потенциально более простой механизм организации очереди запросов. Например, если вам нужно выполнить «горячую» замену части вашей системы, которая обрабатывает большие внутренние запросы, почему бы не отправить эти запросы через посредника, который может отправить их компоненту бэкэнда, если он работает, и накапливать их в очереди, если компонент не работает? Это может позволить вам обновить серверный компонент независимо от остальной части вашей системы без повторного развертывания, как мы говорим в отрасли «весь шебанг».

2 голосов
/ 17 мая 2009

Большинство динамических языков имеют эту возможность. Взгляните на Ruby: вы можете изменять существующие методы и т. Д. Во время выполнения. Когда выйдет IronRuby, вы сможете сделать это и на платформе .Net.

1 голос
/ 27 марта 2010

Но одна вещь, которая требуется для этого, - это фактически передать измененный исходный код или скомпилированный байтовый код в работающий процесс. Какая универсальная платформа может обрабатывать такие вещи?

Erlang уже упоминался, и он использует явные «точки синхронизации», где выполняющаяся подпрограмма может явно обновлять себя, выполняя «self» вызов с использованием «? MODULE: рутинная ()».

Это еще одна важная вещь, которую нужно иметь в виду: вам не просто нужна способность виртуальной машины заменять работающий код, но работающему коду также нужен способ реагировать на такие обновления и соответствующим образом корректировать.

Вы также можете захотеть взглянуть на UpgradeJ , язык, который был специально разработан с учетом требований (горячей замены кода).

1 голос
/ 17 мая 2009

С помощью JavaScript это можно сделать. Что удивительно, так это то, что движок Google V8 имеет открытый исходный код и его легко внедрить в любую программу на C ++.

http://code.google.com/p/v8/

Конечно, вам придется написать немного библиотеки, чтобы показать функциональность и загрузку скрипта изнутри JavaScript. Это будет зависеть от того, что вы хотите сделать.

0 голосов
/ 06 декабря 2010

В .NET это прекрасно реализовано через Managed Extensibility Framework. Эта структура представлена ​​в .NET 4. Вы можете создавать расширяемые приложения. Он делает то, что мог делать контейнер IoC, хотя он может делать больше. Он может обнаружить функциональность, которая не знает априори. Кроме того, вы можете обновить функциональность, вы не знаете, что будет обновляться априори. Другими словами, это основа для модульных приложений, хотите ли вы выполнить горячую замену фрагментов кода и хотите предоставить другую функциональность или обновить уже существующие.

0 голосов
/ 06 апреля 2010

Erlang может делать все, что вы ищете, и он не полагается на какие-либо дополнительные библиотеки (если вы не учитываете OTP в этой категории) или обходные пути кодирования. Он может поддерживать состояние (то есть «значения переменных» на языке императивного языка) при перезагрузке и не требует буферизации или повторной передачи транзакций. Если вы пишете свой код в стиле OTP, то разработчики приложений могут написать простой последовательный код, который будет иметь некоторую степень возможности параллельного выполнения и поддержки горячей перезагрузки, и все это без необходимости беспокоиться о деталях того, как это сделано. Это просто работает.

...