2009-04-18 4 views
3

Я работаю во встроенных системах и системах программирования для аппаратных интерфейсов на сегодняшний день. Для удовольствия и личных знаний, недавно я пытался узнать больше о программировании сервера после того, как мои руки были влажными с Erlang. Я возвращаюсь назад и думаю о серверах из перспективы C++/Java, и теперь мне интересно, как масштабируемые системы могут быть построены с использованием таких технологий, как C++ или Java.Разработка и внедрение сервера

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

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

+0

Я ценю этот вопрос, но, возможно, это четыре или пять квестов, завернутых в один. – ojblass

ответ

1

для C++ Я использовал boost :: asio, это очень современный C++, и он очень хорош для работы. Также сетевые библиотеки C++ 0x будут основаны на реализации ASIO, поэтому это ценные знания.

Что касается дизайна 1thread на клиента, он не работает, как вы уже узнали. И для высокопроизводительной многопоточной обработки наилучшее количество потоков, по-видимому, является CoresX2, но для серверов есть много IO за запрос, что означает много ожидания ожидания. И по опыту, глядя на Apache, MySQL и Oracle, количество потоков связано с CoresX10 для серверов баз данных и CoresX40 для веб-серверов, не говоря о том, что это идеалы, но они кажутся образцами успешных систем, поэтому, если ваша система могут быть сбалансированы для оптимальной работы с похожими номерами, хотя вы будете знать, что ваш дизайн не совсем паршивый.

3

Ваш вопрос слишком общий, чтобы иметь хороший ответ. Ответ в значительной степени зависит от контекста, от того, сколько обрабатывает любой поток, о том, как быстро поступают запросы, о семействе ЦП, используемом веб-контейнере и многих других факторах.

1

Как и Лотар, мы используем библиотеку ACE, которая содержит шаблоны реактора и проактора для обработки асинхронных событий и асинхронного ввода-вывода с кодом на C++. Мы используем значительные пулы рабочих потоков, которые растут по мере необходимости (до настраиваемого максимума) и со временем сокращаются.

Один из трюков с C++ - это то, как вы собираетесь распространять исключения и ситуации с ошибками через границы сети (которые не обрабатываются языком). Я знаю, что есть способы, с помощью которых .NET может генерировать исключения по этим границам сети.

Одна вещь, которую вы можете рассмотреть, - это поиск SOA (Service Oriented Architecture) для решения проблем с распределенной системой более высокого уровня. ACE, если он действительно работает на голом металле машины.

Смежные вопросы