Как «включить веб» унаследованное приложение C ++ - PullRequest
5 голосов
/ 21 июля 2010

Я работаю в системе, которая разделяет пользователей по организациям. Каждый пользователь принадлежит организации. Каждая организация хранит свои данные в своей собственной базе данных, которая находится на компьютере сервера базы данных. Сервер БД может управлять базами данных для 1 или более организаций.

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

Я предоставлю RESTful API для каждого экземпляра, работающего на сервере, чтобы можно было использовать тонкий клиент для доступа к службам, предоставляемым экземпляром, работающим на сервере.

Вот простая схема, которая демонстрирует отношения:

Сервер 1 -> N базы данных (каждая организация имеет одну базу данных)

организация 1 -> N пользователей

Мой вопрос касается того, как «направить» RESTful-запросы от клиента в соответствующий экземпляр, который обрабатывает запросы от пользователей для этой организации.

Более конкретно, когда я получаю запрос RESTful, он будет от пользователя (который принадлежит организации), как (или действительно, каков наилучший способ) «направить» запрос в соответствующий запущенный экземпляр приложения. на сервере?

Ответы [ 4 ]

1 голос
/ 22 июля 2010

Позволить публичному API указывать только пользователя, звучит немного хрупко для меня.Я бы изменил общедоступный API-интерфейс, чтобы запросы указывали как организацию, так и пользователя, а затем имел бы что-то тривиальное на стороне сервера, которое отображает организации на экземпляры (например, organization foo -> instance listen for port 7331).

1 голос
/ 22 июля 2010

Из того, что я могу понять, это по сути проблема шардинга. Независимо от того, как вы разделяете экземпляры на аппаратном уровне (используя виртуальные машины, несколько серверов, все на одном мощном сервере и т. Д.), Вам необходим центральный реестр и уровень посредничества в вашей общей архитектуре, который сопоставляет данных пользователей с правильным целевым экземпляром для каждого запроса . * * 1001

Конечно, есть много способов реализовать это, поэтому просто выберите тот, который вы знаете, он быстрый и будет масштабироваться, так как все запросы будут проходить через него. Я хотел бы предложить легкое веб-приложение без сохранения состояния, поддерживаемое простой базой данных только для чтения, которая выполняет соответствующий идентификатор клиента -> отображение экземпляра, которое вы загружаете в память / кэш. Чтобы добавить гибкость в отношении аппаратного обеспечения и местоположения экземпляра, используйте (предполагая Java) JNDI для хранения информации об оборудовании / порте / и т. Д. Для каждого экземпляра, а в сопоставлении идентификатора сопоставьте идентификатор клиента с соответствующим ключом поиска JNDI.

0 голосов
/ 22 июля 2010

Как говорится в другом ответе, существует много способов решения этой проблемы.Предположим, что вы НЕ имеете доступа к устаревшему исходному коду программного обеспечения, что означает, что вы не можете изменить его для прослушивания на разных портах для разных экземпляров.

Написание модуля Apache кажется ОЧЕНЬ экстремальным для решения этой проблемы (и как кто-токто на самом деле только что закончил писать производственный модуль Apache, я советую избегать его, если вы не зарабатываете серьезные деньги).

Подход может быть настолько эзотерическим, насколько вам нравится.Например, если ваше устаревшее программное обеспечение работает на обычной архитектуре Intel и у вас есть аппаратная емкость, есть решения для виртуальных машин, в которых вы сможете создать тонкую виртуальную машину, одну из которых будет запускать один экземпляр программного обеспечения и мультиплексор, чтобы связать их все.

Если, с другой стороны, вы хорошо запускаете что-то вроде HPUX :-), есть и другие подходы.Как насчет того, чтобы рассказать немного подробнее?

Ахмед.

0 голосов
/ 22 июля 2010

Это действительно очень сложный вопрос;просто потому что есть много возможных ответов, и какой из них лучший, может быть определено только вами и вашей средой.

Я бы написал для этого модуль apache на C ++.Используя эту книгу , мне удалось начать писать очень эффективные модули.

Чтобы дать вам больше решений (возможно, просто настройте прокси-сервер Squid?), Вам нужно будет указатькак вы сможете определить, на какой сервер вам нужно перенаправить клиента.Если вы можете сделать это по IP, хотя это GET-параметр, то есть POST XML-параметр (например, SOAP ).И т.д.

...