-
Notifications
You must be signed in to change notification settings - Fork 0
Java客户端 熔断与监控
Not finished
DAL采取JMX作为缺省的运行状态的监视和修改机制。通过MBean支持数据库熔断配置和操作。
- HA相关的配置和状态
- Markdown相关的配置和状态
- Timeout相关的配置和状态
- DatabaseSet的状态。包括名字,是否markdown和markdown的时间。该组件只支持人工markdown
- Datasource的状态(allinone)。包括名字,是否人工markdown和时间,是否自动markdown和时间
目前只支持timeout的markdown。分两种场景
例如设置:
- 百分比基数为10
- 百分比阀值为80%
- 取样时间为60(秒)
- 允许timeout markdown策略
则当10个请求里面有8个(80%)报错时,会自动markdown发生错误的数据库
例如设置:
- 最小错误个数为5
- 取样的时间区间设置为60秒
- 允许timeout markdown策略
则当60秒内发生5个timeout相关错误时,会自动markdown发生错误的数据库
Dal支持在数据库频繁报告timeout错误时做markdown,并在进入markdown状态以后,过一段时间自动markup。用户可以选择配置自动markup的延迟,缺省的delay是30s。
下面的单元测试代码显示了实际运行过程中从发现错误到markdown,再到markup的过程
@Before
public void setUp(){
DalStatusManager.getMarkdownStatus().setEnableAutoMarkDown(false);
DalStatusManager.getTimeoutMarkdown().setEnabled(false);
DalStatusManager.getTimeoutMarkdown().setErrorCountThreshold(5);
DalStatusManager.getMarkdownStatus().setAutoMarkUpDelay(10);
MarkdownManager.resetAutoMarkdowns();
}
@Test
public void markdownAndDisableAutoMarkdownTest() throws Exception{
DalStatusManager.getMarkdownStatus().setEnableAutoMarkDown(true);
DalStatusManager.getTimeoutMarkdown().setEnabled(true);
Assert.assertFalse(MarkdownManager.isMarkdown(dbName));
for (int i = 0; i < 10; i++) {
MarkdownManager.detect(this.mockDalConnection(), 1000, this.mockTimeoutException());
}
Thread.sleep(1000);
Assert.assertTrue(DalStatusManager.getMarkdownStatus().isMarkdown(dbName));
// Disable auto markdown
DalStatusManager.getMarkdownStatus().setEnableAutoMarkDown(false);
Assert.assertFalse(DalStatusManager.getMarkdownStatus().isMarkdown(dbName));
//Enable again
DalStatusManager.getMarkdownStatus().setEnableAutoMarkDown(true);
Assert.assertFalse(DalStatusManager.getMarkdownStatus().isMarkdown(dbName));
for (int i = 0; i < 4; i++) {
MarkdownManager.detect(this.mockDalConnection(), 1000, this.mockTimeoutException());
Assert.assertFalse(DalStatusManager.getMarkdownStatus().isMarkdown(dbName));
}
MarkdownManager.detect(this.mockDalConnection(), 1000, this.mockTimeoutException());
Thread.sleep(1000);
Assert.assertTrue(DalStatusManager.getMarkdownStatus().isMarkdown(dbName));
}
为了防止状态不一至,每次全局的EnableAutoMarkdow状态发生改变的时候,自动重置所有Datasource的AutoMarkdown状态为false。
所有的属性都只能通过JMX来修改。修改的方式是找到相关属性直接在文本框中填写相应的新值即可。
##手动markdown/markup
手动的markdown/markup支持两个层面,一个是DatabaseSet(逻辑数据库),一个是DataSource(物理数据库)。
所有当前App的DatabaseSet可以JMX的com.ctrip.dal.client.DatabaseSet domain下面找到,按照名字分开显示
所有当前App的DataSource可以JMX的com.ctrip.dal.client.DataSource domain下面找到,按照名字分开显示
在JDK bin目录下面找到jconsole.exe。双击执行
选择对应的JVM实例
总体概览
HAStatus
Markdown
Timeout
DatabaseSet
Datasource