@ThreadSafe public class LightIdBufferedProvider extends Object implements LightIdProvider
轻量级锁,高性能,双缓冲 light-id 提供者。 共存在以下3类线程,且读线程会升级为写线程,甚至加载线程。 同一时刻,有多个读线程,但只有唯一写线程,唯一的加载线程。 - 读线程,正常的light-id调用者 - 写线程,读线程升级或加载线程,为buffer追加片段(segment) - 加载线程,异步线程或读线程升级,通过loader加载segment 双缓冲的运行机制如下,会跟进id的使用量,自动控制预加载量,但不超过maxCount。 - 当Id余量低于20%时,唯一异步预加载`60s内最大使用量`或`maxCount` - 当Id余量用尽时,读线程升级为写线程,其他读线程等待,直到被唤醒或超时 - 当读线程升级写线程时,存在loader,此读线程自旋忙等后,切换buffer。
LightIdProvider.Loader, LightIdProvider.Segment| Constructor and Description |
|---|
LightIdBufferedProvider(LightIdProvider.Loader loader)
序号加载器的线程池,默认使用线程模式 core-size=3, max-size=64, keep-alive 60S
|
LightIdBufferedProvider(LightIdProvider.Loader loader,
ExecutorService executor)
自定义线程模式
|
| Modifier and Type | Method and Description |
|---|---|
void |
cleanError(@NotNull String name,
int block)
清除掉异常信息,计数归零
|
long |
getErrAlive() |
int |
getMaxCount() |
int |
getMaxError() |
long |
getTimeout() |
long |
next(@NotNull String name,
int block)
根据区块和名字获得 LightId,默认5秒超时。
|
long |
next(@NotNull String name,
int block,
long timeout)
根据区块和名字获得 LightId
|
void |
preload(int block)
预先加载分区中所有LightId,建议启动时初始化一次就够了。
|
void |
setErrAlive(long t)
设置错误状态保留时间,过期会清除,默认2分钟。
小于0时表示不会清除
|
boolean |
setMaxCount(int n)
设置加载序号时的最大加载数量,默认10000。
|
boolean |
setMaxError(int n)
设置加载序号中,容忍的最大错误数,默认5。
|
boolean |
setTimeout(long t)
设置请求超时毫秒数,默认1秒。
|
public LightIdBufferedProvider(LightIdProvider.Loader loader)
loader - 序号加载器。public LightIdBufferedProvider(LightIdProvider.Loader loader, ExecutorService executor)
loader - 序号加载器executor - 序号加载器的线程池public long getErrAlive()
public long getTimeout()
public int getMaxError()
public int getMaxCount()
public void setErrAlive(long t)
t - 毫秒数public boolean setTimeout(long t)
t - 毫秒数public boolean setMaxError(int n)
n - 数字public boolean setMaxCount(int n)
n - 数字public void preload(int block)
block - 分区public void cleanError(@NotNull
@NotNull String name,
int block)
name - 名字block - 区块public long next(@NotNull
@NotNull String name,
int block)
LightIdProvidernext in interface LightIdProvidername - Id名字block - 区块编号,生产中心,分库关键public long next(@NotNull
@NotNull String name,
int block,
long timeout)
LightIdProvidernext in interface LightIdProvidername - Id名字block - 区块编号,生产中心,分库关键timeout - 超时毫秒数,建议不要设置(0:无限等),尽量符合业务性能要求。Copyright © 2020. All rights reserved.