Какую технологию Delphi использовать? - PullRequest
5 голосов
/ 07 августа 2010

У меня есть клиент-серверное приложение, написанное на Delphi.По сути, все, что делает приложение, - это передача потоков данных xml между серверным приложением и подключенными клиентами.В настоящее время я использую компонент Indy TIdTCPServer.Но приложение на стороне сервера продолжает падать на некоторых моих взносах.И это было чрезвычайно трудно отлаживать.Поэтому мне интересно, есть ли какая-то «архитектура», которую я должен использовать, которая выполняет все управление соединениями tcp / ip и пулы соединений с базами данных, позволяя мне сосредоточиться на бизнес-логике.

Вот более подробная информация:

  • клиенты должны поддерживать постоянное соединение.Временами сервер должен уведомлять и отправлять данные всем подключенным клиентам.
  • клиенты подключаются с портативных компьютеров с помощью беспроводных карт.Таким образом, сетевые "отбрасывания" довольно распространены.
  • Бэкэнд-база данных - SqlServer.
  • Одновременно может быть подключено до 100 компьютеров одновременно.Когда сервер получает новое соединение (TCPServer.OnConnect), я создаю свой собственный объект, содержащий его собственное соединение с базой данных SqlServer.Когда соединения tcp разрываются, я в свою очередь освобождаю эти объекты (и связанное с ними соединение с базой данных).
  • В клиентское приложение встроен TTimer.Они регулярно отправляют сердцебиения на сервер.И если они «разрывают» / «теряют» свое соединение, они автоматически устанавливают новое соединение, как только сеть возвращается.

У кого-нибудь есть какие-либо предложения относительно лучшего подхода / архитектуры здесь?
Я полагаюКомпонент Indy будет работать, но в то же время я чувствую, что «изобретаю колесо» для управления соединениями.

Ответы [ 6 ]

6 голосов
/ 07 августа 2010

Трехкомпонентные наборы, о которых я знаю, позаботятся о мельчайших технических аспектах клиент-серверных приложений для вас:

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

1 голос
/ 09 августа 2010

Что ж, возможно, потребуется полная перезапись большей части кода C / S, но вместо использования компонентов Indy вы можете вместо этого использовать решение COM +. По сути, вы должны создать компонент COM +, который будет установлен на сервере, и ваши клиентские приложения будут подключаться к этому клиенту и напрямую вызывать функции этого компонента. Он будет иметь управление транзакциями, которое будет обрабатываться самой Windows, и то же самое относится и к обработке транзакций. Технически возможно также создавать события, которые позволили бы серверу выполнять обратные вызовы клиенту, хотя это усложнило бы ситуацию.
Однако я не думаю, что это решение сработает для вас, если у вас нет большого опыта разработки COM в Windows и / или вы достаточно смелы, чтобы попробовать что-то другое.
В прошлом у меня была похожая проблема, когда сотням клиентов приходилось подключаться к одному серверу, совершая все виды транзакций с базой данных. У него крутая кривая обучения, но мне и моей команде удалось заставить все работать, и как только мы поняли методику, это привело к очень стабильному и надежному решению, в котором удалось до 500 пользователей одновременно выполнять обновления и другие действия в одном экстремальный стресс-тест Но опять же, проклятие обучения крутое, поэтому оно может оказаться не тем решением, которое вы ищете.
(Тем не менее, COM + будет использовать множество встроенных в Windows функций, таких как управление транзакциями, пул баз данных и многое другое.)

1 голос
/ 08 августа 2010

Каркас приложений CSI Миши Шарретта в значительной степени соответствует тому, что вы просите.

Это среда Delphi с открытым исходным кодом, в основе которой лежит распределенная среда передачи сообщений и потоков, которая позволяет передавать сообщения XML как от клиента к серверу, так и от сервера к клиенту.

Он может обрабатывать отключения / переподключения, большие номера клиентов, и есть дополнительная виртуальная библиотека баз данных, которая будет обрабатывать SQL-сервер (или вы можете просто использовать тот же доступ к SQL-серверу, который вы используете сейчас).

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

1 голос
/ 08 августа 2010

Если вам нужны легкие компоненты TCP / IP, взгляните на наш модуль SynCrtSock.

Вы найдете низкоуровневые классы для создания IP-клиентов и серверов.Мы внедрили как TCP / IP, так и UDP / IP в одном из наших приложений.

Также существует класс THttpServer, который реализует сервер HTTP / 1.1.Поэтому следует управление подключением HTTP / 1.1.Существует также дополнительное сжатие, и использование HTTP / 1.1 на порте, отличном от 80, является неплохой идеей.И что хорошо с HTTP / 1.1, так это то, что он может проходить через брандмауэры и может быть легко подключен к VPN или размещен на другом HTTP-сервере (например, IIS или Apache) с прокси-сервером.Существует даже класс FastCGI, если вам нужен такой сервер в Linux-решении.Конечно, класс THttpClientSocket делает то же самое для клиентского класса.

Мы используем эти классы для добавления соединения HTTP / 1.1 в нашу открытую среду SQLite3 RESTful - http://synopse.info/forum/viewforum.php?id=2

См. http://synopse.info/fossil/artifact?name=722e896e3d7aad1fe217b0e2e7903483e66d66d1 для устройства SynCrtSock.Открытый исходный код, работа с Delphi 7 до Delphi 2010.

0 голосов
/ 08 августа 2010

Вы также можете взглянуть на комбо ICS / Midware: http://www.overbyte.be/

0 голосов
/ 08 августа 2010

Если вы используете Indy, каждое соединение будет равняться потоку.

В любом случае, я предлагаю для подключения к MSSQL использовать SDAC из Devart http://www.devart.com/sdac/ и для уровня соединения использовать HPScktSrvr на основе I/ O Порт завершения от http://www.torry.net/authorsmore.php?id=7131 (хотя я не знаю, какие изменения понадобятся для изменений TThread в более новых VCL).Вы создаете свой клиентский класс arround THPServerClient, вы устанавливаете свой новый класс в качестве сервера ClientClass, и среда автоматически создаст для вас новых клиентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...