Spring Cloud Streams ไม่ได้ตั้งค่าคีย์ kafka ในข้อความใช่ไหม

เรื่องราวก็เป็นเช่นนี้ ฉันมีนายหน้าคาฟคาและวัตถุเฉพาะ (ซึ่งฉัน jsonify ส่งผ่านหัวข้อของฉัน) ซึ่งมี ID ที่ฉันต้องการใช้เป็นกุญแจ

ขณะนี้ฉันกำลังใช้การกำหนดค่า 'partitionKeyExtractorClass' เพื่อตั้งค่าคลาสที่จะแยก ID และส่งคืนเป็นคีย์

ดูเหมือนว่านี้:

def extractKey(Message<?> message) {
    log.info('Extracting key from message')
    String id = new JsonSlurper().parseText(new String(message.payload)).properties.id
    log.info("Got = ${id}")

    return id
}

ปัญหาที่แท้จริงของฉันคือเมื่อฉันเรียกดูข้อความในหัวข้อ ConsumerRecord ที่เก็บข้อความของฉันแจ้งว่าคีย์เป็นโมฆะ...

นี่เป็นข้อผิดพลาดหรือไม่? ฉันทำอะไรผิดหรือเปล่า? เอกสารเกี่ยวกับเรื่องนี้ไม่ได้ไปไกลกว่านี้


person Murasame    schedule 10.11.2016    source แหล่งที่มา


คำตอบ (1)


ดูสิ คุณกำลังผสม partition กับ key

ในปัจจุบัน KafkaMessageChannelBinder ไม่มีตัวเลือกในการกำหนด key เทียบกับ Message

เฉพาะฟังก์ชันที่มีอยู่ซึ่งคุณสามารถใช้อย่างมีประสิทธิภาพได้คือ KafkaHeaders.MESSAGE_KEY:

    Object messageKey = this.messageKeyExpression != null
            ? this.messageKeyExpression.getValue(this.evaluationContext, message)
            : message.getHeaders().get(KafkaHeaders.MESSAGE_KEY);

ดังนั้น ก่อนข้อความ output คุณควรคำนวณคีย์และวางลงในส่วนหัวนั้น

person Artem Bilan    schedule 10.11.2016
comment
นี่ไม่ใช่วิธีแก้ปัญหาที่ยอมรับได้ ฉันมีปัญหาเดียวกัน ฉันใช้เอาต์พุตโหมดดิบ ฉันไม่ต้องการส่วนหัวใดๆ ในข้อความของฉัน แต่จำเป็นต้องตั้งค่าคีย์ ฉันไม่ต้องการเปลี่ยนมาใช้อูฐ apache - person George Smith; 13.11.2016
comment
ความกังวลของคุณไม่ชัดเจน นั่นเป็นข้อจำกัดของการใช้งาน Kafka Binder ในปัจจุบันโดยที่ mesageKey เป็นเพียงการละเว้น อย่างไรก็ตาม โปรดกรอกประเด็นนี้ด้วย คุณสามารถกำหนดค่า Kafka Binder ไม่ให้แมปส่วนหัวนั้นได้ในตอนนี้ หากคุณใส่ใจเรื่องนั้นมาก และฉันไม่เข้าใจว่า Apache Camel สามารถแทนที่ Spring Cloud Stream ได้อย่างไร - person Artem Bilan; 13.11.2016
comment
ปัญหาคือฉันกำลังรวมสตรีมกับผู้ผลิตและผู้บริโภครายอื่นนอกเหนือจาก Spring Cloud Streams ปุ่มข้อความเป็นสิ่งสำคัญในการรับประกันการสั่งซื้อในหัวข้อคาฟคา การมีส่วนหัวควบคุม Spring Cloud Streams หมายความว่าผู้ผลิตและผู้บริโภครายอื่นๆ ทั้งหมดจะต้องจัดการกับส่วนหัวเฉพาะของ Spring Cloud Streams ฉันต้องการให้ข้อความคาฟคาตรงกับสิ่งที่ฉันต้องการให้เป็น ไม่ใช่สิ่งที่ Spring Cloud Streams ต้องการให้เป็น คีย์ธรรมดาและข้อความ String คือสิ่งที่ฉันต้องการ โหมด raw ให้สิ่งนั้นกับฉัน แต่ไม่มีกุญแจสำคัญในการรักษาความสงบเรียบร้อย - person George Smith; 15.11.2016
comment
และ Apache Camel ก็มีความสามารถเหมือนกันทุกประการ เพื่ออ่านกระแสข้อความ ประมวลผลด้วยวิธีใดวิธีหนึ่ง และกำหนดเส้นทาง/สร้างข้อความใหม่จากข้อมูลที่ประมวลผล - person George Smith; 15.11.2016