Bu ek bölümde farklı DataHub veri türleri için desteklenen işlemler, parçalama stratejileri, veri biçimleri ve mesaj örnekleri açıklanmaktadır.
Farklı veri türleri için desteklenen işlemler
Konu (topic), DataHub'da veri aboneliği ve yayınlamanın temel birimidir ve akış verilerinin bir koleksiyonunu temsil eder. DataHub iki veri türünü destekler: TUPLE ve BLOB.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TUPLE konuları, oluşturulduktan sonra değiştiremeyeceğiniz sabit bir şemaya sahiptir. Kaynak tablo şemasının kararlı olduğu ve
ADD COLUMNveyaDROP COLUMNgibi DDL işlemleri içermediği senaryolar için uygundur. TUPLE konuları, DDL mesajlarının veya kaynaklardan aşağı yönlü tüketicilere gelen kalp atışı mesajlarının iletilmesini desteklemez. Bu birebir eşleme, birçok kaynak tablonuz varsa aşağı yönlü tüketim açısından kullanışsız olabilir; çünkü her biri için karşılık gelen bir konu oluşturmanız gerekir.BLOB konularında önceden tanımlanmış bir şema bulunmaz ve yalnızca ham ikili veriler depolanır; bu da onları daha esnek hale getirir. Kaynaklardan aşağı yönlü tüketicilere DDL mesajlarının ve kalp atışı mesajlarının iletilmesini desteklerler. Tek bir veritabanındaki birden fazla tabloyu tek bir konuyla eşlerler. Bu sayede tüm kaynak tablolar için tek bir konu kullanabilir ve aşağı yönlü tüketimi basitleştirebilirsiniz. Bu tür, DataHub'ın tam veritabanı geçişi için ara mesaj kuyruğu olarak görev yaptığı senaryolar için idealdir.
Farklı veri türleri için parçalama stratejileri
Parça (shard), bir DataHub konusu içindeki veri iletimi için eşzamanlı bir kanaldır. Tek bir parçanın yazma aktarım hızı sınırlı olsa da bunu artırmak için birden çok parça kullanabilirsiniz. DataHub sıralı tüketimi yalnızca tek bir parça içinde garanti eder; birden çok parça arasında garanti etmez. Birden çok parça ile yazma performansını artırırken mesaj sırasını korumak ve veri eğrilmesini önlemek amacıyla DataHub, TUPLE ve BLOB veri türleri için aşağıdaki parçalama stratejilerini sunar.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Veri biçimleri
-
TUPLE
TUPLE biçimi, DataHub tarafından yerel olarak desteklenen veri türlerini kullanır. Bir konu oluşturduğunuzda Data Integration birkaç meta veri sütunu ekler. TUPLE biçiminin şeması hem meta veri sütunlarını hem de iş verisi sütunlarını içerir. Alt çizgi ile başlayan alanlar, örneğin
_sequence_id_ve_operation_type_, meta veri sütunlarıdır. Kalan alanlar iş verisi sütunlarıdır. Meta veri sütunları şunları içerir:_sequence_id_,_excute_time_,_source_table_,_before_image_ve_after_image_.
Parametre
Açıklama
_sequence_id_
Rakamlardan oluşan STRING türünde benzersiz bir mesaj kimliğidir. Aynı güncelleme için yapılan UPDATE_BEFOR ve UPDATE_AFTER işlemleri aynı sıra kimliğini paylaşır.
_excute_time_
Verinin oluşturulduğu zaman.
_source_table_
Kaynak tablonun adı.
_before_image_
Önceki görüntü. UPDATE_BEFOR veya DELETE işlemi için değerY, UPDATE_AFTER veya INSERT işlemi için iseNolur.
_after_image_
Sonraki görüntü. UPDATE_BEFOR veya DELETE işlemi için değerN, UPDATE_AFTER veya INSERT işlemi için iseYolur.Örnek: Aşağıdaki tabloda INSERT, UPDATE ve DELETE deyimlerinin çalıştırılmasından sonra DataHub'a senkronize edilen veriler gösterilmektedir.
_sequence_id_
_operation_type_
_excute_time_
_before_image_
_after_image_
1649991610688000000
I
1649991726000
N
Y
1649991610688000001
U
1649991756000
Y
N
1649991610688000001
U
1649991756000
N
Y
1649991610688000002
D
1649991774000
Y
N -
BLOB
BLOB mesajı, bir JSON dizesi dönüştürülerek oluşturulan ikili veridir. İlgili JSON biçimi aşağıdaki gibidir:
{ "schema": { // Metadata about the change, specifying only column names and types. "dataColumn": [ // Information about the changed data columns, used to update records in the destination table. { "name": "id", "type": "LONG" }, { "name": "name", "type": "STRING" }, { "name": "binData", "type": "BYTES" }, { "name": "ts", "type": "DATE" } ], "primaryKey": [ "pkName1", "pkName2" ], "source": { "dbType": "mysql", "dbVersion": "1.0.0", "dbName": "myDatabase", "schemaName": "mySchema", "tableName": "tableName" } }, "payload": { "before": { "dataColumn":{ "id": 111, "name":"scooter", "binData": "[base64 string]", "ts": 1590315269000 } }, "after": { "dataColumn":{ "id": 222, "name":"donald", "binData": "[base64 string]", "ts": 1590315269000 } }, "sequenceId":XXX, // A string used for data ordering when merging full and incremental data. "op": "INSERT/UPDATE/DELETE/TRANSACTION_BEGIN/TRANSACTION_END/CREATE/ALTER/ERASE/QUERY/TRUNCATE/RENAME/CINDEX/DINDEX/GTID/XACOMMIT/XAROLLBACK/MHEARTBEAT...", // Case-sensitive. "timestamp": { "eventTime": 1, // Required. The time of the record change. A 13-digit timestamp with millisecond precision. "systemTime": 2, // Optional. Exists for some data sources like Oracle CDC. "checkpointTime": 3 // Optional. Included for some data sources like OceanBase. }, "ddl": { "text": "ADD COLUMN ...", "ddlMeta": "[SQLStatement serialized binary, expressed in base64 string]" } }, "version":"1.0.0" }-
BLOB alanları
ÖnemliMesajdaki tüm alanların veri türleri StreamX tarafından tanımlanır ve şunları içerir:
BOOLEAN,DOUBLE,DATE,BYTES,LONGveSTRING.BOOLEAN: The value is `true` or `false`. DATE: The value is a 13-digit integer representing a timestamp with millisecond precision. BYTES: Stores byte arrays as a Base64-encoded string. Use the `java.util.Base64` APIs for Base64 encoding and decoding: String text = "text123"; // Encode Base64.getEncoder().encodeToString(text.getBytes("UTF-8")) // Decode Base64.getDecoder().decode(encodedText)Üst düzey öğe
İkinci düzey öğe
Açıklama
schema
dataColumn
Veri sütunlarının tür bilgilerini içeren bir JSONArray dizisidir.dataColumn, yukarı yönlü bir veri değişikliği kaydındaki tüm sütunları ve türlerini kaydeder. Bir değişiklik işlemi, veri değişikliği (ekleme, silme veya güncelleme gibi) veya tablo yapısı değişikliği olabilir.
name: Sütun adı.
type: Sütun veri türü.
primaryKey
Birincil anahtar sütun adlarını temsil eden bir dize listesidir.
pk: Birincil anahtar adı.
source
Kaynak veritabanı veya tablo hakkında bilgi içeren bir nesnedir.
dbType: Veritabanı türünü temsil eden bir dizedir.
dbVersion: Veritabanı sürümünü temsil eden bir dizedir.
dbName: Veritabanı adını temsil eden bir dizedir.
schemaName: Şema adını temsil eden bir dizedir; PostgreSQL ve SQL Server gibi veritabanları için gereklidir.
tableName: Tablo adını temsil eden bir dizedir.
payload
before
Verinin önceki görüntüsünü içeren bir JSONObject'tir. MySQL kaynağında bir
UPDATEişlemi içinbeforealanı, güncellemeden önceki kayıt içeriğini saklar.Bu alan, kaynaktan bir güncelleme veya silme mesajı okunduğunda doldurulur.
dataColumn: Veri bilgilerini temsil eden JSONObject türünde bir parametredir. Biçimi sütun adı: sütun değeri şeklindedir. Sütun adı bir dizedir ve sütun değeri veri türüne bağlıdır: BYTES türündeki değerler Base64 dizeleri olarak, DATE türündeki değerler long türünde 13 basamaklı zaman damgaları olarak, diğer türlerin değerleri ise yerel türleriyle temsil edilir.
after
Verinin sonraki görüntüsüdür. Biçimi
beforealanıyla aynıdır.NotBu alan,
UPDATEveINSERTişlemleri için gereklidir.op
İşlem türü. Geçerli değerler:
INSERT: Veri ekleme.
UPDATE_BEFOR: Güncelleme işlemi için önceki görüntü.
UPDATE_AFTER: Güncelleme işlemi için sonraki görüntü.
DELETE: Veri silme.
TRANSACTION_BEGIN: Bir veritabanı işleminin başlangıcı.
TRANSACTION_END: Bir veritabanı işleminin sonu.
CREATE: Tablo oluşturma.
ALTER: Tablo değiştirme.
QUERY: Veritabanı değişikliği için orijinal SQL.
TRUNCATE: Tabloyu boşaltma.
RENAME: Tabloyu yeniden adlandırma.
CINDEX: İndeks oluşturma.
DINDEX: İndeks silme.
MHEARTBEAT: Kaynaktan yeni veri gelmese bile senkronizasyon görevinin normal çalıştığını belirten bir kalp atışı mesajı.
timestamp
Bu veri kaydıyla ilgili zaman damgalarını içeren bir JSONObject'tir.
eventTime: Kaynak veritabanında değişikliğin gerçekleştiği zamanı temsil eden Long değeridir. Milisaniye hassasiyetine sahip 13 basamaklı bir zaman damgasıdır.
systemTime: Senkronizasyon görevinin bu değişiklik mesajını işlediği zamanı temsil eden Long değeridir. Milisaniye hassasiyetine sahip 13 basamaklı bir zaman damgasıdır.
checkpointTime: Senkronizasyon ofsetini sıfırlamak için kullanılan zamanı temsil eden Long değeridir. Bu değer genellikle
eventTimeile aynıdır. Milisaniye hassasiyetine sahip 13 basamaklı bir zaman damgasıdır.
ddl
Bu alan yalnızca tablo yapısını değiştiren DDL işlemleri için doldurulur. Veri ekleme, silme ve değiştirme gibi DML işlemleri için ddl alanı null değerini alır.
text: Veritabanı DDL deyimi metnini içeren bir String'dir.
ddlMeta: FastSQL ile DDL deyimi ayrıştırılarak oluşturulan SQLStatement nesnesinin ikili gösterimini içeren ve Base64 ile kodlanmış bir String'dir.
DDL desteğini etkinleştirirseniz sistem seri hale getirilmiş SQLStatement nesnesini iletir. Aşağı yönlü bileşen daha sonra bu nesneyi seri durumdan çıkararak hedef veri kaynağı için DDL deyimini yeniden oluşturabilir ve değişikliği uygulayabilir.
version
Yok
Biçimin sürüm numarası.
-
BLOB serileştirme
Bu JSON biçiminde her mesaj tek bir JSONObject'e karşılık gelir. İç içe geçmiş nesneler ve diziler içerebilen bu JSONObject'in yapısı, mesaj biçimini tanımlar.
Mesajı serileştirmek için JSONObject'i bir dizeye dönüştürün (örneğin fastjson'dan
toJSONStringyöntemini kullanarak) ve ardından dizeyiString.getBytes(Charsets.UTF_8)yöntemini kullanarak bir bayt dizisine dönüştürün.
-
Örnek JSON mesajları
-
Ekleme:
{ "schema": { "dataColumn": [ { "name": "id", "type": "LONG" }, { "name": "name", "type": "STRING" }, { "name": "comment", "type": "STRING" } ], "source": { "dbName": "example_db", "dbType": "MySQL", "tableName": "example_table_pk" }, "primaryKey": [ "id", "name" ] }, "payload": { "op": "INSERT", "after": { "dataColumn": { "name": "joe", "comment": "comment", "id": 1 } }, "sequenceId": "1605339516000000004", "timestamp": { "eventTime": 1605339932000, "systemTime": 1605339932736, "checkpointTime": 1605339932000 } }, "version": "0.0.1" } -
Güncelleme öncesi:
{ "schema": { "dataColumn": [ { "name": "id", "type": "LONG" }, { "name": "name", "type": "STRING" }, { "name": "comment", "type": "STRING" } ], "source": { "dbName": "example_db", "dbType": "MySQL", "tableName": "example_table_pk" }, "primaryKey": [ "id", "name" ] }, "payload": { "op": "UPDATE_BEFOR", "before": { "dataColumn": { "name": "joe", "comment": "comment", "id": 1 } }, "sequenceId": "1605339516000000005", "timestamp": { "eventTime": 1605339934000, "systemTime": 1605339934951, "checkpointTime": 1605339934000 } }, "version": "0.0.1" } -
Güncelleme sonrası:
{ "schema": { "dataColumn": [ { "name": "id", "type": "LONG" }, { "name": "name", "type": "STRING" }, { "name": "comment", "type": "STRING" } ], "source": { "dbName": "example_db", "dbType": "MySQL", "tableName": "example_table_pk" }, "primaryKey": [ "id", "name" ] }, "payload": { "op": "UPDATE_AFTER", "after": { "dataColumn": { "name": "joe", "comment": "com1", "id": 1 } }, "sequenceId": "1605339516000000005", "timestamp": { "eventTime": 1605339934000, "systemTime": 1605339934951, "checkpointTime": 1605339934000 } }, "version": "0.0.1" } -
Silme:
{ "schema": { "dataColumn": [ { "name": "id", "type": "LONG" }, { "name": "name", "type": "STRING" }, { "name": "comment", "type": "STRING" } ], "source": { "dbName": "example_db", "dbType": "MySQL", "tableName": "example_table_pk" }, "primaryKey": [ "id", "name" ] }, "payload": { "op": "DELETE", "before": { "dataColumn": { "name": "joe", "comment": "com1", "id": 1 } }, "sequenceId": "1605339516000000006", "timestamp": { "eventTime": 1605339937000, "systemTime": 1605339937671, "checkpointTime": 1605339937000 } }, "version": "0.0.1" } -
Kalp atışı:
{ "schema": {}, "payload": { "op": "MHEARTBEAT", "timestamp": { "eventTime": 1605339953629, "checkpointTime": 1605339953629 } }, "version": "0.0.1" } -
DDL:
{ "schema": { "source": { "dbName": "example_db", "dbType": "MySQL", "tableName": "example_table_nopk" } }, "payload": { "op": "ALTER", "sequenceId": "1605339516000000035", "ddl": { "text": "alter table example_table_nopk add column holo text", "ddlMeta": "rO0ABXNyACljb20uYWxpYmFiYS5kaS5wbHVnaW4uY2VudGVyLm1ldGEuRERMTWV0YQLb5Cx/YWXtAgACTAAHZGRsVGV4dHQAEkxqYXZhL2xhbmcvU3RyaW5nO0wACXN0YXRlbWVudHQAKkxjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3QvU1FMU3RhdGVtZW50O3hwdAAtYWx0ZXIgdGFibGUgdF9zaGl5dV9ub3BrIGFkZCBjb2x1bW4gaG9sbyB0ZXh0c3IAPGNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5zdGF0ZW1lbnQuU1FMQWx0ZXJUYWJsZVN0YXRlbWVudBQPP3vMUl2cAgAPSQAHYnVja2V0c1oABmlnbm9yZVoAF2ludmFsaWRhdGVHbG9iYWxJbmRleGVzWgAPbWVyZ2VTbWFsbEZpbGVzWgAHb2ZmbGluZVoABm9ubGluZVoADnJlbW92ZVBhdGl0aW5nWgATdXBkYXRlR2xvYmFsSW5kZXhlc1oAD3VwZ3JhZGVQYXRpdGluZ0wAC2NsdXN0ZXJlZEJ5dAAQTGphdmEvdXRpbC9MaXN0O0wABWl0ZW1zcQB+AAZMAAlwYXJ0aXRpb250ACxMY29tL2FsaWJhYmEvZmFzdHNxbC9zcWwvYXN0L1NRTFBhcnRpdGlvbkJ5O0wACHNvcnRlZEJ5cQB+AAZMAAx0YWJsZU9wdGlvbnNxAH4ABkwAC3RhYmxlU291cmNldAA6TGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL2FzdC9zdGF0ZW1lbnQvU1FMRXhwclRhYmxlU291cmNlO3hyACxjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3QuU1FMU3RhdGVtZW50SW1wbEOxUUDVCJMGAgADWgAJYWZ0ZXJTZW1pTAAGZGJUeXBldAAcTGNvbS9hbGliYWJhL2Zhc3RzcWwvRGJUeXBlO0wACWhlYWRIaW50c3EAfgAGeHIAKWNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5TUUxPYmplY3RJbXBs5LvqLFggFVECAAVJAAxzb3VyY2VDb2x1bW5JAApzb3VyY2VMaW5lTAAKYXR0cmlidXRlc3QAD0xqYXZhL3V0aWwvTWFwO0wABGhpbnR0ACxMY29tL2FsaWJhYmEvZmFzdHNxbC9zcWwvYXN0L1NRTENvbW1lbnRIaW50O0wABnBhcmVudHQAJ0xjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3QvU1FMT2JqZWN0O3hwAAAAAAAAAABwcHAAfnIAGmNvbS5hbGliYWJhLmZhc3RzcWwuRGJUeXBlAAAAAAAAAAASAAB4cgAOamF2YS5sYW5nLkVudW0AAAAAAAAAABIAAHhwdAAFbXlzcWxwAAAAAAAAAAAAAAAAc3IAE2phdmEudXRpbC5BcnJheUxpc3R4gdIdmcdhnQMAAUkABHNpemV4cAAAAAB3BAAAAAB4c3EAfgAUAAAAAXcEAAAAAXNyADxjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3Quc3RhdGVtZW50LlNRTEFsdGVyVGFibGVBZGRDb2x1bW4l5T6CFe//BAIABloAB2Nhc2NhZGVaAAVmaXJzdEwAC2FmdGVyQ29sdW1udAAlTGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL2FzdC9TUUxOYW1lO0wAB2NvbHVtbnNxAH4ABkwAC2ZpcnN0Q29sdW1ucQB+ABhMAAhyZXN0cmljdHQAE0xqYXZhL2xhbmcvQm9vbGVhbjt4cQB+AAsAAAAAAAAAAHBwcQB+AA8AAHBzcQB+ABQAAAABdwQAAAABc3IAOWNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5zdGF0ZW1lbnQuU1FMQ29sdW1uRGVmaW5pdGlvbst0gLKZ0qAtAgAmWgANYXV0b0luY3JlbWVudFoADGRpc2FibGVJbmRleFoAB3ByZVNvcnRJAAxwcmVTb3J0T3JkZXJaAAZzdG9yZWRaAAd2aXJ0dWFsWgAHdmlzaWJsZUwACGFubkluZGV4dAApTGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL2FzdC9TUUxBbm5JbmRleDtMAAZhc0V4cHJ0ACVMY29tL2FsaWJhYmEvZmFzdHNxbC9zcWwvYXN0L1NRTEV4cHI7TAALY2hhcnNldEV4cHJxAH4AHkwADWNvbFByb3BlcnRpZXNxAH4ABkwAC2NvbGxhdGVFeHBycQB+AB5MAAdjb21tZW50cQB+AB5MAAtjb21wcmVzc2lvbnQALkxjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3QvZXhwci9TUUxDaGFyRXhwcjtMAAtjb25zdHJhaW50c3EAfgAGTAAIZGF0YVR5cGV0AClMY29tL2FsaWJhYmEvZmFzdHNxbC9zcWwvYXN0L1NRTERhdGFUeXBlO0wABmRiVHlwZXEAfgAKTAALZGVmYXVsdEV4cHJxAH4AHkwACWRlbGltaXRlcnEAfgAeTAASZGVsaW1pdGVyVG9rZW5pemVycQB+AB5MAAZlbmFibGVxAH4AGUwABmVuY29kZXEAfgAfTAAGZm9ybWF0cQB+AB5MABBnZW5lcmF0ZWRBbGF3c0FzcQB+AB5MAAhpZGVudGl0eXQARExjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3Qvc3RhdGVtZW50L1NRTENvbHVtbkRlZmluaXRpb24kSWRlbnRpdHk7TAASanNvbkluZGV4QXR0cnNFeHBycQB+AB5MAAhtYXBwZWRCeXEAfgAGTAAEbmFtZXEAfgAYTAAMbmxwVG9rZW5pemVycQB+AB5MAAhvblVwZGF0ZXEAfgAeTAAEcmVseXEAfgAZTAAMc2VxdWVuY2VUeXBldAAvTGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL2FzdC9BdXRvSW5jcmVtZW50VHlwZTtMAARzdGVwcQB+AB5MAAdzdG9yYWdlcQB+AB5MAAl1bml0Q291bnRxAH4AHkwACXVuaXRJbmRleHEAfgAeTAAIdmFsaWRhdGVxAH4AGUwACXZhbHVlVHlwZXEAfgAeeHEAfgALAAAAAAAAAABwcHEAfgAaAAAAAAAAAAAAAHBwcHBwcHBzcQB+ABQAAAAAdwQAAAAAeHNyADpjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3Quc3RhdGVtZW50LlNRTENoYXJhY3RlckRhdGFUeXBlqtJac/d+04cCAAVaAAloYXNCaW5hcnlMAAtjaGFyU2V0TmFtZXEAfgABTAAIY2hhclR5cGVxAH4AAUwAB2NvbGxhdGVxAH4AAUwABWhpbnRzcQB+AAZ4cgArY29tLmFsaWJhYmEuZmFzdHNxbC5zcWwuYXN0LlNRTERhdGFUeXBlSW1wbEWL29pc1gZFAgAJSgAObmFtZUhhc2hDb2RlNjRaAAh1bnNpZ25lZFoAEXdpdGhMb2NhbFRpbWVab25lWgAIemVyb2ZpbGxMAAlhcmd1bWVudHNxAH4ABkwABmRiVHlwZXEAfgAKTAAHaW5kZXhCeXEAfgAeTAAEbmFtZXEAfgABTAAMd2l0aFRpbWVab25lcQB+ABl4cQB+AAsAAAAAAAAAAHBwcQB+ACP6BPTvGZVAfgAAAHNxAH4AFAAAAAB3BAAAAAB4cHB0AAR0ZXh0cABwcHBwcQB+ABJwcHBwcHBwcHBwc3IAMmNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5leHByLlNRTElkZW50aWZpZXJFeHBy3DXH1zvWbgkCAARKAApoYXNoQ29kZTY0TAAEbmFtZXEAfgABTAAOcmVzb2x2ZWRDb2x1bW5xAH4ADkwAE3Jlc29sdmVkT3duZXJPYmplY3RxAH4ADnhyACdjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3QuU1FMRXhwckltcGxs2ypmFJxWrQIAAHhxAH4ACwAAAAAAAAAAcHBwQCnxzH5tIDl0AARob2xvcHBwcHBwcHBwcHBweHBweHBzcQB+ABQAAAAAdwQAAAAAeHNxAH4AFAAAAAB3BAAAAAB4c3IAOGNvbS5hbGliYWJhLmZhc3RzcWwuc3FsLmFzdC5zdGF0ZW1lbnQuU1FMRXhwclRhYmxlU291cmNlRHD7eYJ4eswCAAVMAAdjb2x1bW5zcQB+AAZMAARleHBycQB+AB5MAApwYXJ0aXRpb25zcQB+AAZMAAhzYW1wbGluZ3QAOExjb20vYWxpYmFiYS9mYXN0c3FsL3NxbC9hc3Qvc3RhdGVtZW50L1NRTFRhYmxlU2FtcGxpbmc7TAAMc2NoZW1hT2JqZWN0dAAxTGNvbS9hbGliYWJhL2Zhc3RzcWwvc3FsL3JlcG9zaXRvcnkvU2NoZW1hT2JqZWN0O3hyADhjb20uYWxpYmFiYS5mYXN0c3FsLnNxbC5hc3Quc3RhdGVtZW50LlNRTFRhYmxlU291cmNlSW1wbAqEMenTm5zUAgAESgAPYWxpYXNIYXNoQ29kZTY0TAAFYWxpYXNxAH4AAUwACWZsYXNoYmFja3EAfgAeTAAFaGludHNxAH4ABnhxAH4ACwAAAAAAAAAAcHBwAAAAAAAAAABwcHBwc3EAfgAqAAAAAAAAAABwcHEAfgA0NH7o4UvP9Dt0AAx0X3NoaXl1X25vcGtwcHBwcA==" }, "timestamp": { "eventTime": 1605342109000, "systemTime": 1605342109259, "checkpointTime": 1605342109000 } }, "version": "0.0.1" }