Проблема заключалась в том, что наш разъем Elasticsearch имел конфигурацию key.ignore
, установленную на true
.
Мы обнаружили эту строку в источнике Github для коннектора (в DataConverter.java ):
final Long version = ignoreKey ? null : record.kafkaOffset();
Это означало, что с key.ignore=true
операции индексирования, которые были будучи сгенерированным и отправленным в Elasticsearch, фактически были «без версии» ... в основном, последний набор данных, полученный Elasticsearch для документа, заменит любые предыдущие данные, даже если это были «старые данные».
При просмотре файлов журнала у соединителя, похоже, есть несколько потоков потребителей, которые читают исходную тему, а затем передают преобразованные сообщения в Elasticsearch, но порядок их передачи в Elasticsearch не обязательно совпадает с порядком тем.
Используя key.ignore=false
, каждое сообщение Elasticsearch теперь содержит значение версии, равное смещению записи Kafka, и Elasticsearch отказывается обновлять данные индекса для документа, если он уже получил данные для более поздней «версии».
Это было не только , только , что исправило это. Нам все еще пришлось применить преобразование к сообщению Debezium из темы Кафки, чтобы получить ключ в формате простого текста, которым Elasticsearch был доволен:
"transforms": "ExtractKey",
"transforms.ExtractKey.type": "org.apache.kafka.connect.transforms.ExtractField$Key",
"transforms.ExtractKey.field": "id"
Можно использовать команду nm для списка символов в статических библиотеках.
nm -g -C <libMylib.a>
Для инструментов Microsoft,"link /dump /symbols <filename>
"предоставит Вам окровавленную подробную информацию. Существуют, вероятно, другие пути (или опции) для предоставления более легкого для чтения списка.
Для двоичных файлов ELF можно использовать readelf:
readelf -sW a.out | awk '$4 == "FUNC"' | c++filt
-s
: символы списка -W
: не сокращайте слишком длинные имена
Команда awk затем отфильтрует все функции, и C++ filt не исказит их. Это означает, что преобразует их из внутренней схемы именования, таким образом, они будут отображены в человекочитаемой форме. Это производит имена, подобные этому (взятый от boost.filesystem lib):
285: 0000bef0 91 FUNC WEAK DEFAULT 11 boost::exception::~exception()
Без C++ filt, имя отображено как _ZN5boost9exceptionD0Ev
В соответствии с Linux/Unix можно использовать objdump -T
перечислять экспортируемые символы, содержавшиеся в данном объекте. В соответствии с Windows существует dumpbin
(IIRC dumpbin /exports
). Обратите внимание, что имена функций C++ искажаются для разрешения перегрузок.
Править: после наблюдения anwser codelogic я помнил, что objdump также понимает-C для выполнения de-искажения.
используйте эту команду:
objdump-t "Ваша-библиотека"
Это распечатает больше, чем Вы хотите - не только имена функций, но и вся таблица символов. Проверьте различные атрибуты символов, которые Вы получаете, и Вы сможете разобраться в функциях от переменных и материала.