Потерянные действия в Aggregated Feed
Прежде всего немного о том, чего я пытаюсь достичь. Я построил оболочку Django поверх библиотеки потоковых фреймворков. Есть 2 кормовых класса - FlatFeed(RedisFeed)
а также AggregatedFeed(RedisAggregatedFeed)
, Очевидно, что они используют Redis для хранения данных канала. Я также реализовал свой собственный класс агрегатора.
Ошибка: созданный агрегированный канал не содержит всех действий, в то время как плоский канал имеет все действия. Вариант использования - есть 3 пользователя A, B и C. B и C выполняют некоторые действия, затем пользователь A следует за B и C. Пользователь B и C продолжает выполнять больше действий. Плоская подача A содержит все активности B и C, но агрегированная подача A имеет некоторые потерянные активности.
Например,
B likes products 1, 2, 3, 4
C likes products 5, 6, 7, 8, 9, 10
A follows B
A follows C
flat_feed (A) имеет все действия, но aggregated_feed(A)
есть только лайки для 1, 5 и 8. Я повторил этот вариант использования несколько раз, и каждый раз приходили только эти 3 действия.
Я проверил мою реализацию класса агрегатора на оболочке django. Вывод функции агрегирования и слияния содержит все действия.
Пожалуйста помоги!!
Обратите внимание, что в плоском фиде есть правильные записи, пропущенные записи только в агрегированных фидах.
2 ответа
Если вы посмотрите на AggregatedActivity
класс рамок, вы заметите, что serialization_id
он же уникальный идентификатор активности рассчитывается на основе количества секунд от эпохи. Это означает, что действия, выполняемые в течение одной секунды, будут перезаписаны.
Вы можете решить эту проблему путем переопределения serialization_id
,serialization_id
= количество миллисекунд от эпохи.
Это должно работать нормально.
Я нашел решение. Я переписал serialization_id
метод AggregatedActivity
как -
def serialization_id(self):
milliseconds = str(int(datetime_to_epoch(self.updated_at)* 1000))
return milliseconds