{"record":{"id":"5c2845b4b21abe9b","repo":"openimsdk/open-im-server","slug":"nil-kafka-config","errorCode":null,"errorMessage":"nil kafka config","messagePattern":"nil kafka config","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/mqbuild/builder.go","lineNumber":43,"sourceCode":"\tTopicToOfflinePush = \"toOfflinePush\"\n)\n\nconst (\n\tGroupRedis       = \"redis\"\n\tGroupMongo       = \"mongo\"\n\tGroupPush        = \"push\"\n\tGroupOfflinePush = \"offlinePush\"\n)\n\nfunc NewBuilder(queue config.EngineSelector, kafka *config.Kafka, redis redis.UniversalClient) (Builder, error) {\n\tengine, err := config.ValidateQueueEngine(queue.Engine, config.Standalone())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tswitch engine {\n\tcase config.QueueEngineKafka:\n\t\tif kafka == nil {\n\t\t\treturn nil, fmt.Errorf(\"nil kafka config\")\n\t\t}\n\t\treturn newKafkaBuilder(kafka), nil\n\tcase config.QueueEngineRedis:\n\t\treturn newRedisBuilder(redis), nil\n\tcase config.QueueEngineMemory:\n\t\treturn standaloneBuilder{}, nil\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported queue engine %s\", queue.Engine)\n\t}\n}\n\nfunc newKafkaBuilder(kafka *config.Kafka) Builder {\n\ttopics := MergeTopics(KafkaTopics(kafka))\n\treturn &kafkaBuilder{\n\t\taddr:         kafka.Address,\n\t\tconfig:       kafka.Build(),\n\t\tlogicalTopic: LogicalTopicNames(topics),\n\t\ttopicGroupID: TopicGroupID(topics),","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/openimsdk/open-im-server/blob/175a7bb0673eca18e9d1b10bff4f728da6b1b513/pkg/mqbuild/builder.go#L25-L61","documentation":"NewBuilder selects a message-queue implementation from queue.Engine. When the engine is Kafka, a non-nil kafka config is required; if kafka is nil the builder returns 'nil kafka config' because it cannot construct the Kafka builder.","triggerScenarios":"Start() calls mqbuild.NewBuilder with queue config where Engine == config.QueueEngineKafka but the Kafka section of the config is absent/null.","commonSituations":"Config file switched engine to kafka without filling the kafka block; env-based config injection missed the kafka section; partial config merge dropped the kafka key.","solutions":["Add a complete kafka config block (addresses/topics) to the config file","Or change queue.Engine to redis/memory if Kafka is not intended","Validate the config at load time before calling Start"],"exampleFix":"// before\nqueue:\n  engine: kafka\n// after\nqueue:\n  engine: kafka\n  kafka:\n    username: \"\"\n    password: \"\"\n    addr: [ \"127.0.0.1:9092\" ]\n    topics: ...","handlingStrategy":"validation","validationCode":"if cfg.Queue.Engine == config.QueueEngineKafka && cfg.Queue.Kafka == nil {\n    return errors.New(\"queue engine is kafka but kafka config section is missing\")\n}","typeGuard":null,"tryCatchPattern":"b, err := mqbuild.NewBuilder(redis, kafka, queue, opts)\nif err != nil && strings.Contains(err.Error(), \"nil kafka config\") {\n    // reload config or fall back to redis engine\n}","preventionTips":["Validate the full queue config struct at startup","Keep engine selection and its config section in sync","Use config schema validation (e.g. required-if rules) in CI"],"tags":["config","kafka","messaging","missing-config"],"backgroundTag":"missing-config-section","analyzedSha":"175a7bb0673eca18e9d1b10bff4f728da6b1b513","analyzedAt":"2026-09-04T16:52:56.821Z","contentChangedAt":"2026-09-04T16:52:56.821Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}