Дизайн логистической системы на основе идеи Zhongtai (2): построение возможности логистического заказа

база данных Архитектура API Государственный аппарат дизайн

Введение

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


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

1. Дизайн модели

2. Дизайн конечного автомата

3. Создавайте интерфейсы с высокой степенью параллелизма

4. Высококонкурентный интерфейс обновления

5. Высококонкурентный интерфейс запросов


2. Дизайн модели данных логистического заказа

Первый взгляд на модель ER


Всего таблиц четыре.Основная модель — это таблицыlogistic_order,logistic_order_packageиlogistic_order_item, а Logistics_order_unique — таблица дедупликации.

1. Логистика_заказ

Описание: Основной лист логистического заказа, весь лист примерно разделен на следующие части информации


дизайн структуры таблицы

Имя поля
Тип поля
Требуется ли
описывать
id
bigint
необходимые
первичный ключ
lg_order_code
varchar(128)
необходимые
номер отправления
trade_order_code
varchar(128)
Не требуется
номер транзакции
receiver_id
bigint
Не требуется
Идентификатор грузополучателя
receiver_name
varchar(64)
Не требуется
Имя грузополучателя
receiver_telephone
varchar(32)
Не требуется
телефон грузополучателя
receiver_province
varchar(32)
Не требуется
Провинция грузополучателя
receiver_city
varchar(64)
Не требуется
город получателя
receiver_area
varchar(64)
Не требуется
зона грузополучателя
receiver_street
varchar(64)
Не требуется
улица грузополучателя
receiver_address
varchar(1024)
Не требуется
Полный адрес грузополучателя
receiver_address_code
varchar(32)
Не требуется
четырехуровневое адресное кодирование
sender_id
bigint
Не требуется
Идентификатор отправителя
sender_name
varchar(64)
Не требуется
Имя грузоотправителя
sender_telephone
varchar(32)
Не требуется
Телефон грузоотправителя
sender_province
varchar(32)
Не требуется
Провинция грузоотправителя
sender_city
varchar(64)
Не требуется
Шиппер Сити
sender_area
varchar(64)
Не требуется
Регион отправителя
sender_street
varchar(64)
Не требуется
Шиппер-стрит
sender_address
varchar(1024)
Не требуется
Полный адрес отправителя
sender_address_code
varchar(32)
Не требуется
четырехуровневое адресное кодирование
buyer_id
bigint
необходимые
Покупатель ID
buyer_name
varchar(64)
Не требуется
Никнейм покупателя
seller_id
bigint
Не требуется
Идентификатор продавца
seller_name
varchar(64)
Не требуется
никнейм продавца
parent_lg_order_code
varchar(128)
Не требуется
Единый номер родительской логистики
biz_type
varchar(32)
необходимые
тип бизнеса
order_origin
int
Не требуется
Источник заказа
order_type
int
необходимые
Тип заказа
status
int
необходимые
государство
mailno
varchar(256)
Не требуется
Номер накладной
express_code
varchar(32)
Не требуется
Код компании курьера
express_name
varchar(32)
Не требуется
Курьерская компания
is_delete
int
необходимые
удалить или нет
feature
varchar(1024)
Не требуется
Расширенное поле, формат JSON
version
int
Не требуется
номер версии, используемый для оптимистической блокировки
gmt_created
datetime
необходимые
время создания
gmt_modified
datetime
необходимые
время редактирования

Дизайн указателя:

а), идентификатор первичного ключа

б) общие индексные поля: lg_order_code, buy_id

2. логистика_заказ_элемент

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


дизайн стола

Имя поля
Тип поля
Требуется ли
описывать
id
bigint
необходимые
первичный ключ
lg_order_code
varchar(128)
необходимые
номер отправления
trade_order_code
varchar(128)
Не требуется
номер транзакции
trade_sub_order_code
varchar(128)
Не требуется
Номер подзаказа транзакции
package_id
bigint
Не требуется
Идентификатор пакета
sku_id
bigint
Не требуется
skuid
sku_name
varchar(256)
Не требуется
Название SKU.
buyer_id
bigint
необходимые
Идентификатор покупателя
seller_id
bigint
Не требуется
Идентификатор продавца
shop_id
bigint
Не требуется
Идентификатор магазина
item_id
bigint
необходимые
идантификационный номер продукта
item_type
int
Не требуется
Типы продуктов
item_name
varchar(256)
Не требуется
наименование товара
item_num
int
необходимые
количество товара
item_weight
decimal
Не требуется
вес товара
item_volumn
decimal
Не требуется
Товарный объем
marking
varchar(128)
Не требуется
Информация на этикетке продукта
status
int
необходимые
государство
feature
varchar(1024)
Не требуется
нет
is_delete
int
необходимые
удалить или нет
version
int
необходимые
номер версии
gmt_created
datetime
необходимые
время создания
gmt_modified
datetime
необходимые
Изменить время

Дизайн указателя:

а), идентификатор первичного ключа

б) общие индексные поля: lg_order_code, buy_id

3. логистика_заказ_пакет

Описание: Логистический пакет – это упаковка логистических товаров. Эта таблица в основном используется для сценария разделения. Существует множество сценариев разделения заказов, например, разные продукты в рамках одного заказа отправляются по разным адресам, продукты крупной бытовой техники разделяются и отправляются, продукты отправляются на отдельные склады и т. д. Короче говоря, каждому пакету соответствует номер накладной с соответствующими данными о происхождении, пункте назначения и логистике.


Вся таблица содержит следующие части информации:


дизайн стола

Имя поля
Тип поля
Требуется ли
описывать
id
bigint
необходимые
первичный ключ
lg_order_code
varchar(128)
необходимые
номер отправления
trade_order_code
varchar(128)
Не требуется
номер транзакции
receiver_id
bigint
Не требуется
Идентификатор грузополучателя
receiver_name
varchar(64)
Не требуется
Имя грузополучателя
receiver_telephone
varchar(32)
Не требуется
телефон грузополучателя
receiver_province
varchar(32)
Не требуется
Провинция грузополучателя
receiver_city
varchar(64)
Не требуется
город получателя
receiver_area
varchar(64)
Не требуется
зона грузополучателя
receiver_street
varchar(64)
Не требуется
улица грузополучателя
receiver_address
varchar(1024)
Не требуется
Полный адрес грузополучателя
receiver_address_code
varchar(32)
Не требуется
четырехуровневое адресное кодирование
sender_id
bigint
Не требуется
Идентификатор отправителя
sender_name
varchar(64)
Не требуется
Имя грузоотправителя
sender_telephone
varchar(32)
Не требуется
Телефон грузоотправителя
sender_province
varchar(32)
Не требуется
Провинция грузоотправителя
sender_city
varchar(64)
Не требуется
Шиппер Сити
sender_area
varchar(64)
Не требуется
Регион отправителя
sender_street
varchar(64)
Не требуется
Шиппер-стрит
sender_address
varchar(1024)
Не требуется
Полный адрес отправителя
sender_address_code
varchar(32)
Не требуется
четырехуровневое адресное кодирование
buyer_id
bigint
необходимые
Идентификатор покупателя
seller_id
bigint
Не требуется
Идентификатор продавца
shop_id
bigint
Не требуется
Идентификатор магазина
mailno
varchar(256)
Не требуется
Номер накладной
express_code
varchar(32)
Не требуется
Код компании курьера
express_name
varchar(32)
Не требуется
Название курьерской компании
pacakge_type
int
необходимые
Тип упаковки
status
int
необходимые
государство
feature
varchar(1024)
Не требуется
нет
is_delete
int
необходимые
удалить или нет
version
int
необходимые
номер версии
gmt_created
datetime
необходимые
время создания
gmt_modified
datetime
необходимые
Изменить время

Дизайн указателя:

а), идентификатор первичного ключа

б) общие индексные поля: lg_order_code, buy_id


4. логистика_заказ_уникальный

Описание: Таблица дедупликации логистики используется для дедупликации при создании.Конкретная функция будет представлена ​​в четвертом разделе.

Имя поля
Тип поля
Требуется ли
описывать
id
bigint
необходимые
первичный ключ
unique_code
varchar(196)
необходимые
удалить повторяющийся номер
trade_code
varchar(128)
необходимые
Номер бизнес-заказа
biz_type
varchar(32)
необходимые
тип бизнеса
lg_order_id
bigint
необходимые
Единый идентификатор первичного ключа логистики
buyer_id
bigint
необходимые
Идентификатор покупателя
gmt_created
datetime
необходимые
время создания
gmt_modified
datetime
необходимые
Изменить время

дизайн индекса

первичный ключ: идентификатор

Уникальный индекс: unique_code

В-третьих, конструкция государственной машины

1. Проект конечного автомата форвардной логистики


А. Создать -> Отгрузка -> Подписать/Отклонить

Это самый простой процесс и процесс, который больше всего волнует пользователей.Если компания использует стороннюю систему логистики, достаточно только этого состояния потока.

б) Создать->Доставка->Заказ на доставку->Сбор доставки->Доставка и доставка->Подписать/Отклонить

Этот поток состояния связан со статусом потока логистики распределения.Как правило, после подключения деталей сторонней логистики будет получена информация о логистике и распределении.

c, Создание -> Доставка -> Склад заказов -> Библиотека хранения -> Распределение Lanshou -> Доставка Доставка -> Подписать/отказаться

Этот поток состояний является наиболее сложным, включая склад и дистрибуцию, как правило, только крупные компании будут рассматривать такой подробный поток состояний.


2. Конечный автомат обратной логистики


Как видно из приведенного выше конечного автомата, существует 4 вида времени для отмены логистики:

1. Отменить после создания

2. Отмена после доставки

3. После того, как склад получит заказ, его можно отменить до освобождения склада.

4. Отмена перед подписанием после доставки

Вышеуказанная ситуация также называется третьими и четвертыми позициями и одним вырезом с одним вырезом, и необходимо соответствовать системам WMS TMS, специально разработанной.

4. Дизайн интерфейса создания заказа в условиях высокой параллелизма

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


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


1. Генерация идентификатора логистического заказа

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

2. Создайте уникальный код дедупликации

Уникальный код дедупликации должен однозначно идентифицировать запрос.Мы используем номер бизнес-заказа + тип бизнеса в качестве кода дедупликации и создаем уникальный индекс, чтобы гарантировать, что он не будет создаваться повторно в условиях высокого параллелизма.

3. Откройте транзакцию сообщения

Так как поток создания заказов очень большой, помимо необходимых операций по вставке данных, другие бизнес-операции должны быть асинхронными через сообщения. Чтобы убедиться, что сообщение может быть отправлено, мы будем использовать гарантию транзакции сообщения MQ. Принцип транзакции сообщения может относиться к этой статье:Генеральный директор woohoo.co.com/article/3rd…

4, открытые транзакции базы данных

Транзакция базы данных не сказала бы, вы можете использовать пружину шаблона транзакции.

5. Вставьте таблицу дедупликации

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

6. Вставьте данные заказа

Базовые операции с базой данных.Если на этом этапе произойдет ошибка, будет отменена вся транзакция.

7. Отправить сообщение

При отправке заказа на создание сообщения через mq на этом этапе возникает ошибка.Согласно введению в приведенной выше статье, MQ будет активно перезванивать системе, чтобы проверить, успешно ли вставлена ​​​​база данных и сообщение не было отправлено. Если это так, сообщение будет установлено как отправленное, чтобы гарантировать его успешную отправку.

Благодаря вышеуказанному процессу мы можем гарантировать высокое сопутствующее удостоверение IdEmpotent создание поручений логистики.


5. Заказать обновление дизайна интерфейса с высокой степенью параллелизма

Центр заказов логистики несет поток статусов всего домена логистики, и в центре заказов логистики будет больше обновлений. В среднем за весь жизненный цикл логистический заказ будет обновляться от 10 до 20 раз, когда логистических заказов много, количество обновлений очень велико, поэтому нам необходимо разработать набор высокопараллельных обновлений. интерфейс.

1. Используйте блокировку версии, чтобы гарантировать, что данные не будут перезаписаны

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


2. Блокировка разделения

Для обновлений некоторые поля обновляются часто, например статус, а некоторые поля обновляются реже. Для полей, которые часто обновляются, если используется блокировка версии, это вызовет большое количество конфликтов версий, которые повлияют на обновления других полей. Поэтому мы можем создать отдельное поле status_version для обновления статуса и использовать это поле только для обновления статуса.Даже если обновление статуса конфликтует, это не повлияет на обновление других полей, тем самым повысив эффективность обновления.

Чтобы разделить блокировки, нам нужно спроектировать два набора интерфейсов на уровне интерфейса: один — общий интерфейс обновления для полного обновления полей, а другой — интерфейс обновления для специальных полей, таких как статус.

3. Сравнение данных

На практике мы обнаруживаем, что интерфейс обновления используется неправильно, например, данные полностью согласованы, а также вызывается интерфейс обновления.Эти вызовы только изменяют поле gmt_modified на уровне базы данных и не имеют никакого другого эффекта. Для этих ложных вызовов мы блокируем их, обновляя сравнение полей, что снижает нагрузку на часть базы данных.


6. Заказать дизайн интерфейса запросов с высокой степенью параллелизма

Центр заказов логистики является ядром области логистики.Почти все другие бизнес-системы полагаются на заказы логистики.Объем вызовов интерфейса запроса для заказов логистики часто очень велик.Можно сказать, что заказ логистики является единственной точкой весь бизнес.Как только центр логистических заказов повесит трубку, последствия будут огромными. Следовательно, мы должны разработать интерфейс запроса заказа с высокой степенью параллелизма.

1. Оптимизация уровня базы данных

Во-первых, это оптимизация на уровне базы данных, подробности в этой статье:Краткое описание.com/afraid/Chengdu 033668…

2. Подбиблиотека и подтаблица

Библиотека логистических заказов неизбежно будет включать подбиблиотеку и подтаблицы.При работе с подбиблиотекой и подтаблицей необходимо обратить внимание на три момента:

а, глобальная генерация идентификатора заказа на логистику

Для глобального создания идентификатора логистического заказа обратитесь к алгоритму Snowflake или методу Ali TDDL.

б. Выберите соответствующие поля подтаблицы

Поле подтаблицы используется для маршрутизации, поэтому необходимо выбрать определенные поля, например идентификатор покупателя.

c, оператор sql, чтобы попытаться не пересекать таблицу

После разделения базы данных на таблицы необходимо разделить некоторые сложные SQL-запросы, иначе это повлияет на производительность. Если его нельзя разделить, его необходимо перенести в поисковую систему.

3. Разделение данных

Данные логистических заказов обычно делятся на горячие данные и холодные данные.Горячие данные – это недавно созданные заказы, и эти заказы все еще находятся в обороте.Холодные данные – это исторические данные, а общий объем запросов очень мал. Мы можем мигрировать исторические данные в Hbase для хранения по определенным правилам, оставляя в базе только горячие данные, тем самым уменьшая объем данных в базе. Для исторических данных нам необходимо предоставить интерфейс запроса для исторических данных.

4, оптимизация интерфейса запросов

Мы разработали интерфейс запроса, дизайн объекта объекта логистики, содержащий запрос, а также некоторые переключатели:


isIncludePackage: этот переключатель сообщает интерфейсу, следует ли проверять информацию о пакете.

isIncludeItems: этот переключатель сообщает интерфейсу, следует ли проверять элементы логистики.

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

5, кластер отдельных чтения и записи

Когда ни одна из вышеперечисленных стратегий не может увеличить параллелизм, у нас есть последнее средство — добавить машины. Однако добавление машин не является случайным добавлением.Чтобы использовать собственные ресурсы более научно, мы делим кластеры на кластеры чтения и кластеры записи.Через правила маршрутизации интерфейса dubbo трафик чтения распределяется на кластер чтения, и трафик записи распределяется на кластер записи. Мы планируем емкость кластера в соответствии с пиковым значением запросов на чтение и запись и динамически расширяем емкость.

7. Резюме

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

Для получения дополнительных статей, пожалуйста, посетите http://www.apexyun.com/

Контактный адрес электронной почты: public@space-explore.com

(Пожалуйста, не перепечатывайте без разрешения)