1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/AhooWang-CosId

28.02.2025 04:08
GitLife Service Account

Добавьте SmartIntervalShardingAlgorithm (COSID_INTERVAL), чтобы одновременно поддерживать COSID_INTERVAL_DATE, COSID_INTERVAL_LDT, COSID_INTERVAL_TS и COSID_INTERVAL_TS_SECOND.

Последнее сообщение коммита: Update notes for SmartIntervalShardingAlgorithm.TIMESTAMP_TYPE_KEY
28.02.2025 04:08
GitLife Service Account
  • Добавлена реализация CosIdIntervalShardingAlgorithm, которая выполняет org.apache.shardingsphere.sharding.spi.ShardingAlgorithm для повышения производительности и удобства использования INTERVAL.
    введите описание изображения здесь
    • Удобство использования: нативная поддержка различных типов данных (Long, LocalDateTime, Date), в то время как официальная реализация сначала преобразует данные в строку, а затем в LocalDateTime. Преобразование успешнее проходит при отсутствии влияния символов формата времени.
    • Производительность: по сравнению с официальной реализацией org.apache.shardingsphere.sharding.algorithm.sharding.datetime.IntervalShardingAlgorithm производительность увеличивается минимум в 1200–4000 раз.
      введите описание изображения здесь
    • Интервал-основанный алгоритм шардинга по временному диапазону
    • DateIntervalShardingAlgorithm (COSID_INTERVAL_DATE)
    • LocalDateTimeIntervalShardingAlgorithm (COSID_INTERVAL_LDT)
    • SnowflakeIntervalShardingAlgorithm (COSID_INTERVAL_SNOWFLAKE)
    • TimestampIntervalShardingAlgorithm (COSID_INTERVAL_TS)
    • TimestampOfSecondIntervalShardingAlgorithm (COSID_INTERVAL_TS_SECOND)
spring:
  shardingsphere:
    rules:
      sharding:
        sharding-algorithms:
          alg-name:
            type: COSID_INTERVAL_{type_suffix}
            props:
              logic-name: logic-name
              id-name: cosid-name
              datetime-lower: 2021-12-08T22:00:00
              datetime-upper: 2022-12-01T00:00:00
              sharding-suffix-pattern: _yyyyMM
              datetime-interval-unit: MONTHS
              datetime-interval-amount: 1
  • Добавлена базовая тестовая конфигурация CosIdIntervalShardingAlgorithm против org.apache.shardingsphere.sharding.algorithm.sharding.datetime.IntervalShardingAlgorithm.
gradle cosid-shardingsphere:jmh
# JMH версия: 1.29
# Версия JVM: JDK 11.0.13, OpenJDK 64-Bit Server VM, 11.0.13+8-LTS
# Опции JVM: -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/work/CosId/cosid-shardingsphere/build/tmp/jmh -Duser.country=CN -Duser.language=zh -Duser.variant
# Режим черной дыры: полный + dont-inline подсказка
# Подготовка: 1 итерация, 10 секунд каждая
# Измерение: 1 итерация, 10 секунд каждая
# Время ожидания: 10 минут на каждую итерацию
# Нити: 1 нить, будет синхронизировать итерации
# Режим бенчмарка: пропускная способность, операций/время
Benchmark                                                          Mode  Cnt         Score   Error  Units
IntervalShardingAlgorithmBenchmark.cosid_precise_local_date_time  thrpt       66276995.822          ops/s
IntervalShardingAlgorithmBenchmark.cosid_precise_timestamp        thrpt       24841952.001          ops/s
IntervalShardingAlgorithmBenchmark.cosid_range_local_date_time    thrpt        3344013.803          ops/s
IntervalShardingAlgorithmBenchmark.cosid_range_timestamp          thrpt        2846453.298          ops/s
IntervalShardingAlgorithmBenchmark.office_precise_timestamp       thrpt           6286.861          ops/s
IntervalShardingAlgorithmBenchmark.office_range_timestamp         thrpt           2302.986          ops/s
  • API изменения: открытый интерфейс SnowflakeFriendlyId.getParser
  • Исправление: проблема неверного присвоения значений конструктору JdbcIdSegmentInitializer #I4LVBZ (CosIdJdbcSegmentAutoConfiguration,jdbcIdSegmentInitializer)
Последнее сообщение коммита: add Interval-based-sharding-algorithm-jmh report
28.02.2025 04:07
GitLife Service Account

Улучшение: добавлен модуль cosid-shardingsphere с поддержкой CosIdKeyGenerateAlgorithm для org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm

Конфигурация на Kotlin

    implementation("me.ahoo.cosid:cosid-shardingsphere:${cosidVersion}")
spring:
  shardingsphere:
    rules:
      sharding:
        key-generators:
          cosid:
            type: COSID
            props:
              id-name: __share__
Последнее сообщение коммита: add CosIdKeyGenerateAlgorithm tp support `org.apache.shardingsphe...
28.02.2025 04:07
GitLife Service Account
  • Оптимизация производительности: использование AtomicLongFieldUpdater вместо AtomicLong для дальнейшего снижения частоты создания DefaultIdSegment, что позволяет снизить нагрузку на выделение памяти и сборку мусора (генератор ID в режиме сегментации).
  • Оптимизация: добавление поддержки прерывания потока ответа через сигнал CacheClock.
Последнее сообщение коммита: - performance:Use AtomicLongFieldUpdater to replace AtomicLong ...
28.02.2025 04:07
GitLife Service Account

Улучшения

  • Добавлена поддержка пользовательских часовыми поясами (SnowflakeFriendlyId)
  • Изменено поведение метода SnowflakeFriendlyId.generateAsString, теперь по умолчанию он возвращает friendlyId
Последнее сообщение коммита: - Support custom time zone (SnowflakeFriendlyId).
28.02.2025 04:07
GitLife Service Account
  • Добавлен UuidGenerator
  • Улучшено: добавлена проверка отката для распределителя диапазонов идентификаторов NextMaxId
Последнее сообщение коммита: add UuidGenerator
28.02.2025 04:06
GitLife Service Account
  • Рефакторинг CosIdAnnotationSupport
  • Добавление CosIdAccessor
    • Поддержка наследования декларации @CosId в дочерних классах от родительских
    • Приоритетное использование методов getter/setter для автоматического внедрения ID
  • Отсутствие поддержки объявления нескольких @CosId аннотаций для одного экземпляра
Последнее сообщение коммита: update version
28.02.2025 04:06
GitLife Service Account

Улучшение: Добавлено CosIdAnnotationSupport, которое поддерживает автоматическое внедрение ID на основе аннотации @CosId.

public class Entity {

    @CosId
    private long id;

    @CosId
    private String stringId;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getStringId() {
        return stringId;
    }

    public void setStringId(String stringId) {
        this.stringId = stringId;
    }

}
        Entity entity = new Entity();
        cosIdAnnotationSupport.ensureId(entity);
        Assertions.assertEquals(1L, entity.getId());
        Assertions.assertEquals("2", entity.getStringId());
Последнее сообщение коммита: add CosIdAnnotationSupport
28.02.2025 04:06
GitLife Service Account
  • Улучшение: Добавлен CosIdPlugin (cosid-mybatis), который обеспечивает поддержку распределённых ID через аннотацию для автоматического внедрения.

@Target({ ElementType.FIELD })
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface CosId {
    String value() default IdGeneratorProvider.SHARE;

    boolean friendlyId() default false;
}
public class Order {

    @CosId
    private long id;

    @CosId
    private String stringId;

    @CosId(friendlyId = true)
    private String friendlyId;

    @CosId(value = "bizC")
    private long bizId;

    /**
     * ...
     * getter or setter
     */
}

@Mapper
public interface OrderRepository {
    @Insert("insert into t_order (id, string_id, friendly_id, biz_id) values (#{id}, #{stringId}, #{friendlyId}, #{bizId});")
    void insert(Order order);

    @Insert({
            "<script>",
            "insert into t_order (id, string_id, friendly_id, biz_id)",
            "VALUES",
            "<foreach item='item' collection='list' open='' separator=',' close=''>",
            "(#{item.id}, #{item.stringId}, #{item.friendlyId}, #{item.bizId})",
            "</foreach>",
            "</script>"})
    void insertList(List<Order> orderList);
}
Order order = new Order();
orderRepository.insert(order);
/**
 * {
 *   "id": 213044050087903230,
 *   "stringId": "213044050087903233",
 *   "friendlyId": "20210803212059708-0-2",
 *   "bizId": "bk801"
 * }
 */
return order;
Последнее сообщение коммита: update README.md
28.02.2025 04:06
GitLife Service Account
  • Устранение проблемы несовместимости с версиями Redis 5.0 и ниже.
Последнее сообщение коммита: Fix the issue of throwing exception when redis is lower than 5.0 ...
28.02.2025 04:06
GitLife Service Account
  • Зависимость обновлена: CoSky -> 1.2.8
  • Неразрывные изменения: Изменено имя модуля: spring-boot-starter-cosid -> cosid-spring-boot-starter (соответствует соглашению по названию внешних проектов spring-boot-starter). Благодарим @fxbin за PR.
Последнее сообщение коммита: update version
28.02.2025 04:06
GitLife Service Account

Обновлено :tada: :tada: :tada: :tada: :tada: :tada:

  • Добавлена WIKI-документация
  • Добавлен метод IdGenerator.generateAsString по умолчанию
Последнее сообщение коммита: update README.zh-CN.md
28.02.2025 04:06
GitLife Service Account

Улучшение: добавление проверок параметров для повышения robustности кода.

(Текст уже был на русском языке, поэтому изменения минимальны.)

Последнее сообщение коммита: enhancement: add defensive parameter check to enhance robustness.
28.02.2025 04:06
GitLife Service Account
  • Улучшение: Добавлено объединение IdSegment с помощью нового объекта MergedIdSegment, чтобы избежать создания большого количества объектов IdSegment.
  • Улучшение: Введен новый пул предварительной загрузки PrefetchWorkerExecutorService (PrefetchWorker 1:n PrefetchJob), что повышает эффективность использования PrefetchWorker и предотвращает создание большого количества потоков из-за объявления большого количества SegmentChainId (PrefetchWorker 1:1 PrefetchJob).
  • Улучшение: Используется CacheClock вместо System.currentTimeMillis для повышения производительности получения текущего времени.
    • System.currentTimeMillis: слишком медленный, TPS составляет только 7191W/с, ниже пикового значения, которое может достичь SegmentChainId12743W/с. При включении функции ttl для IdSegment это влияет на пиковую производительность SegmentChainId.
    • CacheClock: TPS составляет 41765W/с, точность — одна секунда. Приложение должно принимать во внимание возможность небольшой задержки в одну секунду, которая возможна при использовании CacheClock. Это полностью применимо в сценариях проверки TTL.
  • Улучшение: Проверка переполнения при вычислении значений.
  • Улучшение: Оптимизация логики расчета безопасного промежутка (safeGap).
Последнее сообщение коммита: optimize the calculation of safety distance
28.02.2025 04:05
GitLife Service Account
  • Добавлено: модуль cosid-spring-redis, поддерживающий spring-data-redis и исключающий повторную конфигурацию spring.redis. Спасибо за обратную связь @bitfoolbear
  • Исправлено: двойное выполнение операции предварительной загрузки при первом запуске PrefetchWorker
  • Исправлено: ошибочное логическое сообщение в PrefetchWorker
Последнее сообщение коммита: add cosid-spring-redis
28.02.2025 04:05
GitLife Service Account
  • Улучшение: IdSegment теперь поддерживает TimeToLive (время жизни).
  • Добавлено: схема проектирования SegmentId.
    SegmentId
Последнее сообщение коммита: Add wiki-reference for README
28.02.2025 04:05
GitLife Service Account
  • Улучшено: PrefetchWorker теперь поддерживает динамическое расширение и сжатие в зависимости от состояния голода с использованием безопасного расстояния (safeDistance) для повышения производительности.
  • Добавлено: Включен cosid-jdbc, что позволяет использовать реляционные базы данных как IdSegmentDistributor.
  • Изменено: По умолчанию установлен режим SegmentIdProperties.Mode в CHAIN (цепочное число сегмента, рекомендовано).
Последнее сообщение коммита: update benchmark
28.02.2025 04:05
GitLife Service Account
  • Оптимизация: Введен абстрактный интерфейс IdSegment.
  • Улучшение: Улучшена защита от ошибок в DefaultSegmentId после проверки позднего получения номеров от бэкенд-генератора, что предотвращает потерю сегмента и возможность отката.
  • Улучшение: Улучшено поддержание IdSegmentDistributor для поддержки получения нескольких сегментов за один запрос, снижающее частоту запросов сетевых ID и повышающее производительность.
  • Оптимизация: Улучшена производительность SegmentChainId (lock-free), при правильной конфигурации она может достичь уровня производительности AtomicLong (10272W+/с JMH тестирование).
  • Добавлено: Добавлена реализация IdSegmentDistributor.Mock для имитации сетевых запросов генератора номеров, что облегчает проведение тестов.
  • Улучшение: Поддержка активации режима SegmentChainId через конфигурацию Spring Boot (spring-boot-starter-cosid).
  • Добавлено: Добавлен LifecycleSegmentChainId для элегантного завершения PrefetchWorker.

Примечание: Изображение RedisChainIdBenchmark было заменено на ссылку, чтобы сохранить его в документе.

Последнее сообщение коммита: Update performance report
28.02.2025 04:05
GitLife Service Account
  • Добавлен экспериментальный режим сегментной цепочки для усиления API (SegmentChainId), поддерживающий предварительное получение диапазонов.
    SegmentClainId
Последнее сообщение коммита: Update the SegmentChainId design diagram
28.02.2025 04:05
GitLife Service Account
  • Улучшение: Абстракция RedisIdGenerator была обновлена до SegmentId (модель номерного сегмента).
  • Добавление: Введен API IdSegmentDistributor для повышения расширяемости модели номерного сегмента, что позволит в будущем поддерживать больше типов хранилищ номерных сегментов.
  • Улучшение: Общий IdGenerator с ключом __share__ был внедрен в IdGeneratorProvider для унификации опыта использования IdGeneratorProvider.
  • Обновление: Версия Gradle была обновлена до 7.1.
Последнее сообщение коммита: update gradle 7.0 -> 7.1
1
https://api.gitlife.ru/oschina-mirror/AhooWang-CosId.git
git@api.gitlife.ru:oschina-mirror/AhooWang-CosId.git
oschina-mirror
AhooWang-CosId
AhooWang-CosId