需要监听的库和表

上线时间

申请完成在本地开发时,可以用test结尾的ClientName来做开发,避免相互影响。

使用方法简介

PumaClient client = new PumaClientConfig()
.setClientName("your-client-name")
.setDatabase("database")
.setTables(Lists.newArrayList("table0", "table1"))
.buildClusterPumaClient();
while(!Thread.currentThread().isInterrupted()) {
try {
BinlogMessage binlogMessage = client.get(10, 1, TimeUnit.SECOND);
//todo: 处理数据
client.ack(binlogMessage.getLastBinlogInfo());
} catch(Exception e) {
//这里的异常主要是用来打点的,便于及时发现问题
}
}

PumaClient所有操作都是同步操作,并且线程不安全。

如果是job项目可以直接写上述代码。但是如果是在service或者web项目中,一定要新启一个线程来跑上述代码。

PumaClientConfig API && PumaClient API

代码即是文档。

建议直接在项目中看源码,或者到这里看源码:

最佳实践

import com.dianping.cat.Cat;
import com.dianping.puma.api.PumaClient;
import com.dianping.puma.api.PumaClientConfig;
import com.dianping.puma.api.PumaClientException;
import com.dianping.puma.core.dto.BinlogMessage;
import com.dianping.puma.core.event.Event;
import com.dianping.puma.core.event.RowChangedEvent;
import com.google.common.collect.Lists;
import java.util.concurrent.TimeUnit;
public class Example1 {
/**
* 假设这是一个 web 或 service 项目
* 可以尝试运行多个,并随机关掉其中正在运行的那个,来模拟 failover
*
* @param args
*/
public static final void main(String... args) {
//不要阻塞主线程,需要自己令起线程
Thread pumaClientThread = new Thread(new Runnable() {
@Override
public void run() {
PumaClient client = new PumaClientConfig()
.setClientName("puma-client-example-test")
.setDatabase("Puma")
.setTables(Lists.newArrayList("PumaServer"))
.buildClusterPumaClient();
while (!Thread.currentThread().isInterrupted()) {
try {
BinlogMessage message = client.get(100, 1, TimeUnit.SECONDS);
for (Event event : message.getBinlogEvents()) {
if (event instanceof RowChangedEvent) {
RowChangedEvent rowChangedEvent = (RowChangedEvent) event;
System.out.println(rowChangedEvent.toString());
//todo: 处理数据
}
}
client.ack(message.getLastBinlogInfo());
} catch (PumaClientException e) {
Cat.logError(e.getMessage(), e);
}
}
}
});
pumaClientThread.setName("puma-client-example-test");
pumaClientThread.setDaemon(true);
pumaClientThread.start();
while (true) {
try {
Thread.sleep(1);
} catch (InterruptedException ignore) {
}
}
}
}

FAQ

PumaClient 如何双机部署

PumaClient只支持 failover,不支持 loadbalance。

如果你担心自己的程序因为 bug 或者上线部署而停止,可以双机部署PumaClient,它们的ClientName必须相同。两台机器同时启动时,只有一台会收到数据,另外一台会阻塞。当其中一台挂掉后,另一台会开始消费数据。