Как сгенерировать номер заказа при большом трафике

Архитектура

В случае низкой посещаемости генерируется номер заказа


я давно писалИспользуйте БД для создания первичного ключа бизнесаВ статье рассказывается об использовании БД для создания уникальных идентификаторов. Вот как в то время был сгенерирован номер заказа. Просто после получения ID, согласно порядку дела, просто добавить префикс.

@Service
public class KeyGen{
   @Autowired
   private KeyGenRepository keyGenRepository;
   public long genNo(){
   KeyGen keyGen = new KeyGen();
   keyGenRepository.genarateNo(keyGen );
   //这个就是我们需要的no
   long no = keyGen.getNo();
   }
}
private String generateOrderNo() {
        StringBuffer sbf=new StringBuffer();
        //前缀
        sbf.append("100");
        long no = keyGen.genNo();
        sbf.append(no);
        return sbf.toString();
    }

Этот метод использовался в течение определенного периода времени, и дублирующихся номеров заказов обнаружено не было. Это решение является基础的思路, Какими бы сложными ни были правила генерации заказов, если номер заказа должен содержать уникальный атрибут, хорошим решением будет использование функции самоувеличения базы данных.


Генерация номеров заказов для большого трафика


Если объем заказов в час очень велик, скажем, два миллиона заказов в час, используйте единыйkey_genТаблица не может быть поддержана, ведь давление записи слишком велико, что влияет на скорость генерации номера заказа. В это время вы можете рассмотреть генерацию номера заказа,单独的Библиотеки и подбиблиотеки, уменьшитьinsertдавление, чтобы увеличить скорость генерации номеров заказов.


Правила подбиблиотеки


Существует способ сопоставления на основе складов.Например, если компания электронной коммерции имеет в общей сложности 50 складов, можно выполнить следующее сопоставление:

warehouse1:数据库0
warehouse2:数据库0
warehouse3:数据库1
warehouse4:数据库1
warehouse5:数据库2
warehouse6:数据库2
warehouse7:数据库3
warehouse8:数据库3
warehouse9:数据库3
warehouse10:数据库4
。。。。。。
。。。。。。
warehouse50:数据库9

Сопоставьте 50 складов с базой данных, соответствующей [0-9].При размещении заказа, если склад, соответствующий заказу, — склад1, он будет сопоставлен с базой данных 0, а если соответствующий склад — склад10, с соответствующей базой данных 4. Таким образом, нагрузка по генерации номеров заказов распределяется по 10 базам данных.

После подбиблиотеки каждая подбиблиотека имеетkey_genповерхность.


Номер заказа сборки


Целью вышеуказанной подбазы данных и подтаблицы является создание уникального идентификатора.Этот идентификатор является частью номера заказа.Идентификатор генерируется с помощью базы данных, но последующая сборка номера заказа является полностью операции бизнес-логики, и нет необходимости использовать базу данных.

У каждой компании свои требования к правилам формирования номеров заказов, например:

Время + 6-значное случайное число + уникальный идентификатор, сгенерированный базой данных + идентификатор склада

Генерация времени может быть легко сгенерирована с помощью следующего кода:

SimpleDateFormat formatShort = new SimpleDateFormat("yyMMdd");
Date now = new Date();
String currentDate = formatShort.format(now);

С помощью JAVA можно использовать шестизначные случайные числа.AtomicLongДля достижения может обрабатывать параллелизм.

На данный момент номер заказа полностью сформирован. Есть дырка? Из-за подбиблиотеки каждая библиотека имеетkey_gen, сгенерированный идентификатор уникален только в библиотеке, и несколько библиотек не обязательно. Например, запросы, созданные двумя заказами, склады 1 и 3 соответственно, направляются на склад 1 и склад 3 соответственно в соответствии с приведенными выше правилами конфигурации.数据库0и数据库1Эти две библиотеки в настоящее время могут генерировать один и тот же идентификатор. Но не забывайте, генерация номера заказа включает в себя идентификатор склада, один 1, другой 3, которые разные, и есть случайные числа, поэтому вероятность дублирования номера заказа в принципе маловероятна.