Лучшая практика для сохранения очень занятого счетчика в БД - PullRequest
1 голос
/ 02 мая 2019

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

public void Upload(int organizationId)
{
  try
  {
    lock (UpadateLock)
    {
       using (var db = new DbContext())
       {
         Counter counter = db.Counters.Where(c => c.OrganizationId == organizationId).FirstOrDefault();
         counter.count++;
         db.SaveChanges();

       }
     }
   }
   catch (Exception ex)
   {

   }
}

1 Ответ

0 голосов
/ 02 мая 2019

Если вы абсолютно не можете потерять данные после смерти сервера, вы должны записывать в постоянное хранилище для каждого приращения.

Вопрос только в том, какой магазин использовать.

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

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

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

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

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