2008-10-15 2 views
2

У меня есть приложение, которое производится из следующих компонентов:Архитектура приложений - Как бы вы разработать этот процесс

Центральная база данных, содержащая 100k + записи Ряд «клиента» базы данных каждая из которых содержит около 10-20k записей

В клиентских базах данных содержатся сведения о контактах, каждый из которых имеет уникальный идентификатор (contactID).
Центральная база данных содержит некоторые из этих контактов, идентифицированных одним и тем же contactID.

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

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

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

Как бы вы создали это, чтобы он работал как можно быстрее?

ответ

3

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

Из верхней части моей головы, что-то, как это будет работать немного лучше:

  1. Получить «диф», содержащий все изменения в основной базе данных. Это можно сделать до начала синхронизации и только один раз в день.
  2. Отправить полный список контактов от клиента к серверу. Со списком, который большой, на самом деле не имеет значения, как он отправляется, но если вам не нравятся веб-сервисы SOAP, подумайте о JSON. Я бы пошел с веб-сервисами для удобства. Опять же, список контактов может быть подготовлен заранее.
  3. Создайте список записей, которые необходимо обновить, сравнивая «diff» со списком от клиента.
  4. Получить все обновленные детали за один раз (если вы используете MS SQL вы можете сделать это с помощью XML, другие услуги SQL предлагают различные пути)
  5. Отправить детали клиенту

Тот же механизм может используется только для обновления только одной записи, вам просто нужно использовать другой список (содержащий 1 идентификатор) в p.2

1

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

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

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

или

  1. Есть третья сторона создать веб-сервис, который содержит документ XML, содержащий дамп контакты детали в их системе, которые изменились в течение определенного периода. Затем вы обработали этот документ, обновив свои данные.
0

Вы можете запросить файл (XML), содержащий все данные ID из центральной базы данных, и вы можете преобразовать его в некоторые сопоставления объектов. Затем, имея список объектов в конце, вы можете сравнить и обновить соответственно.

1

Перейдите на полную ставку, если возможно.

Открытие TCP/IP-соединения - ОЧЕНЬ медленный процесс. Перенос идентификаторов контактов 20K (даже если идентификатор огромен) в одном WS-запросе намного быстрее, чем запросы веб-сервисов 20K.

Вы не хотите ждать ответа. У вас есть два типа потенциальных рабочих процессов.

  1. Busy Waiting. Вы отправляете пакет. Вы проводите опрос каждые несколько минут, пока партия не будет выполнена. Это довольно нехорошо, но полностью односторонне. Вы выполняете всю работу, они просто отвечают «еще не сделано» или «сделано». Затем вы запрашиваете результаты своей партии.

  2. Уведомление. Вы отправляете пакет, включая адрес, на который вы можете получать уведомления. Это может быть адрес электронной почты, или это может быть URL (IP-адрес, порт и путь), по которому вы хотите получать уведомления.

    • Если вы решили использовать уведомление по электронной почте (или подобное), вы можете сделать правильный запрос WS для извлечения партии.

    • Если вы решили использовать уведомление WS, у вас есть небольшая веб-служба, которая либо получает простое уведомление, либо выполняет запрос WS для получения результата, либо отправляет вам весь результат.

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

0

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

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