本文主要研究一下SpinalTap的BinlogEventjava
SpinalTap/spinaltap-mysql/src/main/java/com/airbnb/spinaltap/mysql/event/BinlogEvent.javamysql
@Getter @ToString public abstract class BinlogEvent extends SourceEvent { private final long tableId; private final long serverId; private final BinlogFilePos binlogFilePos; public BinlogEvent(long tableId, long serverId, long timestamp, BinlogFilePos binlogFilePos) { super(timestamp); this.tableId = tableId; this.serverId = serverId; this.binlogFilePos = binlogFilePos; } public long getOffset() { return (binlogFilePos.getFileNumber() << 32) | binlogFilePos.getPosition(); } public boolean isMutation() { return this instanceof WriteEvent || this instanceof DeleteEvent || this instanceof UpdateEvent; } }
SpinalTap/spinaltap-mysql/src/main/java/com/airbnb/spinaltap/mysql/event/StartEvent.javagit
public class StartEvent extends BinlogEvent { public StartEvent(long serverId, long timestamp, BinlogFilePos filePos) { super(0L, serverId, timestamp, filePos); } }
SpinalTap/spinaltap-mysql/src/main/java/com/airbnb/spinaltap/mysql/event/TableMapEvent.javagithub
@Getter public final class TableMapEvent extends BinlogEvent { private final String database; private final String table; private final List<ColumnDataType> columnTypes; public TableMapEvent( long tableId, long serverId, long timestamp, BinlogFilePos filePos, String database, String table, byte[] columnTypeCodes) { super(tableId, serverId, timestamp, filePos); this.database = database; this.table = table; this.columnTypes = new ArrayList<>(); for (byte code : columnTypeCodes) { columnTypes.add(ColumnDataType.byCode(code)); } } }
SpinalTap/spinaltap-mysql/src/main/java/com/airbnb/spinaltap/mysql/event/WriteEvent.javasql
@Getter public final class WriteEvent extends BinlogEvent { private final List<Serializable[]> rows; public WriteEvent( long tableId, long serverId, long timestamp, BinlogFilePos filePos, List<Serializable[]> rows) { super(tableId, serverId, timestamp, filePos); this.rows = rows; } @Override public int size() { return rows.size(); } }
List<Serializable[]>
的rows屬性SpinalTap/spinaltap-mysql/src/main/java/com/airbnb/spinaltap/mysql/event/DeleteEvent.javaide
@Getter public final class DeleteEvent extends BinlogEvent { private final List<Serializable[]> rows; public DeleteEvent( long tableId, long serverId, long timestamp, BinlogFilePos filePos, List<Serializable[]> rows) { super(tableId, serverId, timestamp, filePos); this.rows = rows; } @Override public int size() { return rows.size(); } }
List<Serializable[]>
的rows屬性SpinalTap/spinaltap-mysql/src/main/java/com/airbnb/spinaltap/mysql/event/UpdateEvent.javathis
@Getter public class UpdateEvent extends BinlogEvent { private final List<Map.Entry<Serializable[], Serializable[]>> rows; public UpdateEvent( long tableId, long serverId, long timestamp, BinlogFilePos filePos, List<Map.Entry<Serializable[], Serializable[]>> rows) { super(tableId, serverId, timestamp, filePos); this.rows = rows; } @Override public int size() { return rows.size(); } }
List<Map.Entry<Serializable[], Serializable[]>>
的rows屬性SpinalTap/spinaltap-mysql/src/main/java/com/airbnb/spinaltap/mysql/event/QueryEvent.javacode
@Getter public class QueryEvent extends BinlogEvent { private final String database; private final String sql; public QueryEvent( long serverId, long timestamp, BinlogFilePos filePos, String database, String sql) { super(0l, serverId, timestamp, filePos); this.database = database; this.sql = sql; } }
SpinalTap/spinaltap-mysql/src/main/java/com/airbnb/spinaltap/mysql/event/XidEvent.javaserver
@Getter public class XidEvent extends BinlogEvent { private final long xid; public XidEvent(long serverId, long timestamp, BinlogFilePos filePos, long xid) { super(0l, serverId, timestamp, filePos); this.xid = xid; } }
SpinalTap/spinaltap-mysql/src/main/java/com/airbnb/spinaltap/mysql/event/GTIDEvent.java繼承
@Getter public class GTIDEvent extends BinlogEvent { private final String gtid; public GTIDEvent(long serverId, long timestamp, BinlogFilePos filePos, String gtid) { super(0, serverId, timestamp, filePos); this.gtid = gtid; } }
BinlogEvent繼承了SourceEvent,它定義了tableId、serverId、binlogFilePos屬性;其子類主要有StartEvent、TableMapEvent、WriteEvent、DeleteEvent、UpdateEvent、QueryEvent、XidEvent、GTIDEvent