Слияние кода завершено, страница обновится автоматически
Добавьте SmartIntervalShardingAlgorithm
(COSID_INTERVAL), чтобы одновременно поддерживать COSID_INTERVAL_DATE, COSID_INTERVAL_LDT, COSID_INTERVAL_TS и COSID_INTERVAL_TS_SECOND.
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
SnowflakeFriendlyId.getParser
JdbcIdSegmentInitializer
#I4LVBZ (CosIdJdbcSegmentAutoConfiguration,jdbcIdSegmentInitializer)Улучшение: добавлен модуль 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__
AtomicLongFieldUpdater
вместо AtomicLong
для дальнейшего снижения частоты создания DefaultIdSegment
, что позволяет снизить нагрузку на выделение памяти и сборку мусора (генератор ID в режиме сегментации).CacheClock
.SnowflakeFriendlyId
)SnowflakeFriendlyId.generateAsString
, теперь по умолчанию он возвращает friendlyId
UuidGenerator
NextMaxId
CosIdAnnotationSupport
CosIdAccessor
@CosId
в дочерних классах от родительскихgetter
/setter
для автоматического внедрения ID@CosId
аннотаций для одного экземпляраУлучшение: Добавлено 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());
@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;
Redis 5.0
и ниже.spring-boot-starter-cosid
-> cosid-spring-boot-starter
(соответствует соглашению по названию внешних проектов spring-boot-starter). Благодарим @fxbin за PR.IdGenerator.generateAsString
по умолчаниюУлучшение: добавление проверок параметров для повышения robustности кода.
(Текст уже был на русском языке, поэтому изменения минимальны.)
IdSegment
с помощью нового объекта MergedIdSegment
, чтобы избежать создания большого количества объектов IdSegment
.PrefetchWorkerExecutorService
(PrefetchWorker
1:n PrefetchJob
), что повышает эффективность использования PrefetchWorker
и предотвращает создание большого количества потоков из-за объявления большого количества SegmentChainId
(PrefetchWorker
1:1 PrefetchJob
).CacheClock
вместо System.currentTimeMillis
для повышения производительности получения текущего времени.
System.currentTimeMillis
: слишком медленный, TPS составляет только 7191W/с
, ниже пикового значения, которое может достичь SegmentChainId
— 12743W/с
. При включении функции ttl
для IdSegment
это влияет на пиковую производительность SegmentChainId
.CacheClock
: TPS составляет 41765W/с
, точность — одна секунда. Приложение должно принимать во внимание возможность небольшой задержки в одну секунду, которая возможна при использовании CacheClock
. Это полностью применимо в сценариях проверки TTL
.safeGap
).cosid-spring-redis
, поддерживающий spring-data-redis
и исключающий повторную конфигурацию spring.redis
. Спасибо за обратную связь @bitfoolbearPrefetchWorker
PrefetchWorker
IdSegment
теперь поддерживает TimeToLive (время жизни).SegmentId
.Примечание: Изображение RedisChainIdBenchmark было заменено на ссылку, чтобы сохранить его в документе.
SegmentChainId
), поддерживающий предварительное получение диапазонов.__share__
был внедрен в IdGeneratorProvider для унификации опыта использования IdGeneratorProvider.