.NET или MySql или другое решение для миллионов поисков в день (чтобы остановить дублирование) - PullRequest
1 голос
/ 02 сентября 2011

У меня есть клиент-серверная архитектура, написанная на .NET, где сотни клиентов отправляют данные на один сервер.Каждый элемент имеет идентификатор, и разные клиенты могут отправлять один и тот же идентификатор несколько раз.

Идентификаторы являются длинными, и сервер должен знать, получил ли он уже что-то с тем же идентификатором.Каждый день сервер будет получать около 10 000 000 идентификаторов с ~ 1 000 000 дубликатов.Каждый раз, когда он получает идентификатор, ему нужно будет выполнить какой-то поиск, чтобы увидеть, был ли он уже обработан.Чрезвычайно маловероятно получить дубликат идентификатора через несколько дней.

Мои текущие идеи для решений:

  • В памяти словарь идентификаторов с фоновым потоком для удалениялюбые элементы после того, как они были в словаре более 3 дней.

  • База данных MySql с одним индексированным столбцом для идентификаторов и столбцом для даты вставки.

Проблемы, с которыми я сталкиваюсь, заключаются в том, с какой скоростью будет выполняться запрос к базе данных MySql, потому что мне приходится выполнять ~ 10 000 000 запросов в день.Я не собираюсь использовать причудливое оборудование для этой конкретной проблемы (типичная система разработки) и не хочу облагать налогом 100%.Проблема с решением в памяти состоит в том, что будет сложно написать фоновый рабочий (параллелизм), и все потеряно в маловероятном, но возможном сбое.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2011

Вы можете попробовать хранилище значений ключей .

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

Помимо проектов по ссылке выше, вы можете рассмотреть Berkeley DB , который имеетC # API и включает в себя кэш в памяти.

0 голосов
/ 02 сентября 2011

Не уверен насчет части MySQL - обычно она хорошо масштабируется с используемым HW ...

Для части Dictionary просто используйте ConcurrentDictionary - это поточно-ориентированныйи очень быстро, так как большинство операций осуществляются без блокировки.

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