Надежны ли розетки? - PullRequest
7 голосов
/ 21 июля 2009

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

Мои вопросы: надежны ли сокеты, если мне нужна только однажды / гарантированная доставка данных?

Есть ли другие решения?

Спасибо.

Ответы [ 8 ]

14 голосов
/ 21 июля 2009

Сокеты - это API уровня приложения для выполнения сетевого взаимодействия. Надежность сокетов зависит от сетевого протокола, который вы выбираете при создании сокета. Если вы выберете TCP / IP, вы получите «надежную» передачу ... до предела. Если вы выберете UDP / IP, вы получите «ненадежный» перевод.

Как указано в других ответах, TCP гарантирует, что вы не потеряете и не повредите данные до определенного момента:

  1. если сеть достаточно длинная отключение или отправитель или получатель умирает, соединение TCP / IP будет разорвано и вы потеряете данные, если вы предпринять шаги, чтобы перезапустить подключение.
  2. если есть сеть уровень повреждения данных, есть малая вероятность того, что это не будет обнаружены контрольными суммами.

Для обеспечения более высоких уровней надежности, чем обеспечивает TCP / IP, вам необходимо внедрить более чувствительные контрольные суммы и механизмы гарантированной доставки поверх сетевого уровня вашего приложения на основе сокетов. Или используйте продукт очереди сообщений, который сделает всю работу за вас.

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

2 голосов
/ 21 июля 2009

Сокеты надежны, так как все коммуникации выполняются поверх них, включая MQ.

Но вы можете добавить гарантированную доставку с MQ, чтобы повысить надежность вашего приложения. Что это? Гарантированная доставка гарантирует, что ваше сообщение будет обработано потребителем как минимум один раз и не более одного раза. потребитель выключен? продюсер выключен? сервер MQ выключен? диск падает? Благодаря MQ ни одно сообщение не будет потеряно, что бы ни случилось (при условии, что ваш админ знает свою работу). В дополнение к этому, если вы перезапустите потребителя, никакое сообщение не будет обработано дважды. Что может быть важно, если сообщения содержат переводы миллионов долларов. Но это не гарантирует, что ваше сообщение будет обработано в разумные сроки. а время обработки иногда важнее гарантированной доставки, в зависимости от вашего приложения.

Это зависит от вас, чтобы выбрать лучший способ связи между вашими серверами в зависимости от ваших потребностей. Гарантированная доставка доставляет как финансовые, так и эксплуатационные расходы, поэтому ее следует использовать только в том случае, если она действительно необходима (например, переводы в миллионы долларов).

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

Надеюсь, это поможет.

  • Джеб
2 голосов
/ 21 июля 2009

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

2 голосов
/ 21 июля 2009

Сокеты так же надежны, как и ваша реализация, и основаны на базовом оборудовании. Если вы не хотите создавать гарантированную услугу доставки (при каких условиях 100% никогда не случится), система очереди сообщений - хорошая ставка. В очереди сообщений будут реализованы все данные о постоянстве, очередях, повторных попытках и т. Д., Которые вам потребуется реализовать самостоятельно, если вы используете стандартные сокеты.

1 голос
/ 21 июля 2009

Сокеты - это необработанный механизм для передачи данных. Все остальное реализовано поверх этого. В сетевой модели OSI они относятся к уровню 4. Несмотря на то, что они обеспечивают надежное сквозное соединение, они редко используются в качестве конечного протокола. Вам почти всегда нужно реализовать прикладной уровень. Что это будет, зависит от вашего приложения (вам нужно передавать файлы или просто отправлять сообщения) и вашей сетевой инфраструктуры.

0 голосов
/ 21 июля 2009

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

0 голосов
/ 21 июля 2009

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

0 голосов
/ 21 июля 2009

Если вы используете потоковый сокет , протокол TCP гарантирует, что данные не будут потеряны при передаче и вряд ли будут повреждены (хотя вы должны решить, достаточны ли его 16-битные контрольные суммы или вам нужна механизм контрольной суммы уровня приложения).

Что обеспечивают системы MQ, и что вам может или не может понадобиться, это уровень приложения тип транзакции надежность, т.е. способность гарантировать доставку даже в случае периодических сбоев оборудования или программного обеспечения.

...