Как реализовать идемпотентность и дедупликацию в бэкенде?

Java задняя часть Java EE
Как реализовать идемпотентность и дедупликацию в бэкенде?

интервьюер:Почему бы тебе не рассказать мне, что ты недавно смотрел? Можно вытащить и обсудить

Кандидат: Недавно я смотрел контент, связанный с «дедупликацией» и «идемпотентом».

интервьюер:Тогда давайте сначала поговорим о вашем понимании «дедупликации» и «идемпотентности».

Кандидат: Я думаю, что «идемпотент» и «дедупликация» похожи, и я не могу сказать, что между ними строгое различие.

Кандидат: Позвольте мне рассказать вам о моем личном понимании, я не знаю, правильно это или нет.

Кандидат: «Дублирование» - это деуплиплировать запрос или сообщение «N раз» в течение «определенного периода времени»

Кандидат: «Идемпотент» должен гарантировать, что запрос или сообщение обрабатываются «в любое время», и он должен гарантировать, что его результат непротиворечив.

Кандидат: Будь то «дедупликация» или «идемпотент», необходимо иметь «уникальный ключ» и место для «хранения» уникального ключа.

Кандидат: Взяв в качестве примера проект, «платформа управления сообщениями», которую я поддерживаю, имеет функцию «удаления дубликатов»: «удалить дубликаты для сообщений с одинаковым содержанием за 5 минут», «дедуплицировать шаблоны в течение 1 часа», «удалить дубликаты». когда канал достигает N порогов за один день" "…

Кандидат: Еще раз подчеркнем сущность «идемпотента» и «дедупликации»: «Уникальный ключ» + «Хранилище».

интервьюер:Так как ты это сделал

Кандидат: В разных бизнес-сценариях уникальный ключ отличается, что определяется бизнес-процессами.

Кандидат: существует множество вариантов хранения, таких как «локальный кеш»/«Redis»/«MySQL»/«HBase» и т. д. Конкретный выбор также связан с бизнесом.

Кандидат: Например, в сценарии «платформа управления сообщениями» я храню выбранный «Redis» (с превосходной производительностью чтения и записи), а у Redis также есть «срок действия» для решения проблемы «определенного периода времени».

Кандидат: А единственный Ключ естественно строится по разным делам.

КандидатНапример: «Дедупликация сообщений с тем же содержимым за 5 минут», я напрямую использую параметр запроса MD5 в качестве уникального ключа. «Шаблон дедупликации за 1 час» - это «шаблон ID + UserID», как уникальный ключ, «дедупликация канала в течение одного дня» является «ID канала + UserID», как единственный ключ ...

интервьюер:Теперь, когда упоминается «дедупликация», вы слышали о фильтрах Блума?

Кандидат: Конечно знаешь

интервьюер:Давайте поговорим о фильтрах Блума, почему вы их не используете?

Кандидат: Основную структуру данных фильтра Блума можно понимать как растровое изображение, а растровое изображение также можно просто понимать как массив.Элементы хранят только 0 и 1, поэтому он занимает относительно небольшое пространство.

Кандидат: Когда элемент должен быть сохранен в растровом изображении, на самом деле необходимо увидеть, где он хранится в растровом изображении.В это время обычно используется алгоритм хеширования, а место хранения помечается как 1

Кандидат: Позиция, отмеченная 1, указывает на существование, а позиция, отмеченная 0, указывает на то, что она не существует.

Кандидат: Фильтр Блума — это небольшой след, определяющий, есть ли элемент для дальнейшей дедупликации, но он также имеет соответствующий недостаток.

Кандидат: Пока используется алгоритм хеширования, он неотделим от «коллизии хэшей», что приводит к «неправильной оценке».

Кандидат: В фильтре Блума, если считается, что элемент существует, то этот элемент «может не существовать» на самом деле. Если считается, что элемент не существует, он не должен существовать

Кандидат: Мне не нужно больше объяснять, верно? (Сочетание «алгоритма хеширования» и «позиция, отмеченная 1, указывает на существование, а позиция, отмеченная 0, указывает на отсутствие», можно сделать вышеуказанный вывод)

Кандидат: фильтр Buron не «удаляет» элементы (также ограничения алгоритма хеширования, не может точно найти элемент в фильтре Buron)

Кандидат: Если вы хотите использовать его, реализацию фильтра Блума можно реализовать непосредственно в Guava, но это автономный

Кандидат: Для распределенного фильтра Блума сейчас обычно используется Redis, но не каждая компания будет развертывать Redis-версию фильтра Блума (все еще есть ограничения, как в моей предыдущей компании).

Кандидат: Итак, в настоящее время проекты, за которые я отвечаю, не используют фильтры Блума (:

Кандидат: Если стоимость «удаления дубликатов» относительно велика, вы можете рассмотреть возможность установки логики «многоуровневой фильтрации».

Кандидат: Например, сначала посмотреть, может ли «локальный кеш» отфильтровать часть, а оставшуюся «сильную проверку» передать в «удаленное хранилище» (обычный Redis или БД) для вторичной фильтрации

интервьюер: Ну тогда я помню, когда ты в последний раз отвечал Кафке

интервьюер: В свое время вы говорили, что реализована как минимум одна + идемпотентность при работе с ордерами

интервьюер: Во время идемпотентной обработки: Redis используется для предварительной фильтрации, а уникальный индекс БД используется для строгой проверки согласованности, что также повышает производительность, верно?

интервьюер: Единственный ключ, кажется, «Номер заказа + Статус заказа»

Кандидат:интервьюерУ тебя очень хорошая память!

Кандидат: Вообще, нам нужно проверить данные на строгую непротиворечивость, поэтому идем сразу в MySQL (БД), ведь там есть поддержка транзакций

Кандидат: «локальный кеш», если бизнес подходит, его можно использовать как «предварительное» суждение.

Кандидат: высокопроизводительные операции чтения и записи Redis, как до вынесения решения, так и после обработки (:

Кандидат: HBase обычно используется в сценариях с огромными объемами данных (память Redis слишком дорогая, БД недостаточно гибкая и не подходит для хранения больших объемов данных в одной таблице)

Кандидат: Что касается идемпотентности, то общее хранилище по-прежнему "Redis" и "база данных"

Кандидат: наиболее распространенным является «уникальный индекс» базы данных для достижения идемпотентности (несколько проектов, за которые я отвечаю, используют это).

Кандидат: создание «уникального ключа» — это вопрос, связанный с бизнесом (: как правило, он объединяется со своим собственным бизнес-идентификатором для создания «значимого» уникального ключа

Кандидат: Конечно, он также использует «Redis» и «MySQL» для реализации распределенной идемпотентной блокировки (:

Кандидат: Но распределенные блокировки Redis не могут быть полностью гарантированы, а MySQL реализует распределенные блокировки (оптимистичные блокировки и пессимистичные блокировки по-прежнему связаны с бизнесом, я никогда их не использовал)

Кандидат: Есть много решений для достижения «идемпотентности» в Интернете, которые, по сути, делают некоторые варианты вокруг «хранилища» и «уникального ключа», а затем берут имя...

Кандидат: В общем, меняем суп, не меняя лекарство (:

интервьюер: Ах ... понять

Добро пожаловать в мой публичный аккаунт WeChat【Java3y] Давайте поговорим о Java-интервью, серия онлайн-интервьюеров постоянно обновляется!

Серия [Онлайн-интервьюер-Мобильный терминал]Продолжаем обновлять два раза в неделю!

【Онлайн-интервьюер-компьютер】СерияПродолжаем обновлять два раза в неделю!

Оригинал это не просто! ! Проси три! !