Несколько актеров, которые записывают в один и тот же файл + поворот - PullRequest
2 голосов
/ 07 марта 2011

Я написал очень простой веб-сервер в Scala (на основе Actors).Цель этого - регистрировать события с нашего веб-сервера (например, если пользователь нажимает кнопку или загружается страница).Файл нужно будет поворачивать каждые 64-100 МБ или около того, и он будет отправлен на s3 для последующего анализа с помощью Hadoop.объем трафика будет около 50-100 вызовов / с

Некоторые вопросы, которые возникают у меня в голове:

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

Ответы [ 2 ]

7 голосов
/ 07 марта 2011

Один простой способ - создать один субъект записи файлов, который сериализует все записи на диск.После этого вы могли бы иметь несколько действующих лиц обработчиков запросов, которые передавали ему обновления по мере обработки событий регистрации событий с внешнего сервера.Вы получите параллелизм в обработке запросов, продолжая сериализацию записей в ваш файл журнала.Наличие более одного субъекта откроет возможность одновременной записи, что в лучшем случае повредит ваш файл журнала.По сути, если вы хотите, чтобы что-то было потокобезопасным в модели актера, это должно быть выполнено на одном акторе.К сожалению, ваша задача по сути является последовательной в момент записи на диск.Вы могли бы сделать что-то более сложное, например, объединить файлы журналов, поступающие от нескольких акторов во время ротации, но это кажется излишним.Если вы не сгенерируете эти 64-100 МБ за секунду или две, я был бы удивлен, если бы дополнительные потоки, выполняющие ввод-вывод, купили вам что-нибудь.

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

0 голосов
/ 07 марта 2011

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

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

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

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