Интеграция Kafka в unity3d вызывает ошибку Win32Exception

Я пытаюсь запустить образец кода Кафка в среде единства, и по этой причине я создал клиент потребитель (код приведен ниже).

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Confluent.Kafka;
using Confluent.Kafka.Serialization;
using System.Text;

public class KafkaConsumer : MonoBehaviour 
{
    // Use this for initialization
    void Start () 
    {
        /*
         * The consumer application will then pick the messages from the same topic and write them to console output. 
         * The process to create the consumer application is also very simple.
         */
        var config = new Dictionary<string, object>
        {
            { "group.id","JavaInUseGroup" },
            { "bootstrap.servers", "localhost:9092" },
            { "enable.auto.commit", "false" }
        };

        using (var consumer = new Consumer<Null, string>(config, null, new StringDeserializer(Encoding.UTF8)))
        {
            consumer.Subscribe(new string[] { "javainuse-topic" });

            consumer.OnMessage += (_, msg) =>
            {
                //Console.WriteLine($"Topic: {msg.Topic} Partition: {msg.Partition} Offset :{msg.Offset} {msg.Value}");
                Debug.Log($"Topic: {msg.Topic} Partition: {msg.Partition} Offset :{msg.Offset} {msg.Value}");

                consumer.CommitAsync(msg);
            };

            while (true)
            {
                consumer.Poll(100);
            }
        }
    }
}

Чтобы выполнить приведенный выше пример кода, я также добавил confluent.Kafka dll в папку ресурсов моего проекта. но всякий раз, когда я запускаю свою игру Unity, она выдает ошибка: Win32Exception: указанный модуль не найден.

Rethrow as InvalidOperationException: Error while loading librdkafka.dll or its dependencies from Assets/librdkafka.dll. Check the directory exists, if not check your deployment process. You can also load the library and its dependencies by yourself before any call to Confluent.Kafka Confluent.Kafka.Impl.LibRdKafka.Initialize (System.String userSpecifiedPath) (at <700d5bbe3b974ce5aed001c82b789f6a>:0) Confluent.Kafka.Consumer..ctor (System.Collections.Generic.IEnumerable1[T] config) (at <700d5bbe3b974ce5aed001c82b789f6a>:0) Confluent.Kafka.Consumer2[TKey,TValue]..ctor (System.Collections.Generic.IEnumerable1[T] config, Confluent.Kafka.Serialization.IDeserializer1[T] keyDeserializer, Confluent.Kafka.Serialization.IDeserializer`1[T] valueDeserializer) (at <700d5bbe3b974ce5aed001c82b789f6a>:0) KafkaConsumer.Start () (at Assets/KafkaConsumer.cs:26)

Поскольку ошибка указывает на проблему зависимости, я также скопировал эти DLL в папку assets/librdkafka/x64.

  1. либрдкафка
  2. librdkafkacpp

  3. msvcr120

  4. zlib

Теперь проблема в том, что мой проект зависает всякий раз, когда я пытаюсь его воспроизвести.

Помните: я загрузил все эти dll через nuget в vs 2017. Затем я объединил эти dll в единство.

На самом деле, я не могу себе представить ситуацию, когда приложению Unity3d нужен клиент Kafka внутри. Вы пытаетесь создать мобильный (ПК, Xbox, что угодно) клиент, который отправляет некоторые данные непосредственно брокеру Kafka?

Victor Perov 23.02.2019 02:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
1 100
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для будущих пользователей вот процесс добавления Kafka в ваш проект Unity3d: На самом деле существует определенный порядок или иерархия папок для добавления dll в ваш проект. (Я не нашел авторитетной ссылки на это, если кто-то нашел, пожалуйста, поделитесь)

  1. Сначала вставьте Confluen.Kafka dll в любую папку.

  1. Затем создайте папку librdkafka (убедитесь, что она создана рядом с dll confluent.kafka) и вставьте dll, связанную с платформой, в папку x64 или x86.

Теперь вы можете запустить мой пример кода (упомянутый в вопросе).

ПРИМЕЧАНИЕ: После сборки плеера вам необходимо вручную скопировать dll-файлы в папку Player/Managed/librdkafka. Вы должны создать папку librdkafka в управляемой папке, а затем вставить свои DLL (опять же, я не знаю, зачем это нужно, но если кто-то нашел авторитетную ссылку, поделитесь)

Если вы просмотрите источник: https://github.com/confluentinc/confluent-kafka-dotnet/blob/master/src/Confluent.Kafka/Impl/LibRdKafka.cs#L323-L374, confluent.kafka будет динамически загружать librdkafka, который эти dll:

  1. libeay32.dll
  2. librdkafka.dll
  3. librdkafkacpp.dll
  4. libzstd.dll
  5. msvcp120.dll
  6. msvcr120.dll
  7. ssleay32.dll
  8. zlib.dll

Либо нужно скопировать в ту же папку, где остается Confluent.Kafka.dll, либо создать папку librdkafka, подобную этой, в ту же папку:

\---librdkafka
    +---x64
    |       libeay32.dll
    |       librdkafka.dll
    |       librdkafkacpp.dll
    |       libzstd.dll
    |       msvcp120.dll
    |       msvcr120.dll
    |       ssleay32.dll
    |       zlib.dll
    |
    \---x86
            libeay32.dll
            librdkafka.dll
            librdkafkacpp.dll
            libzstd.dll
            msvcp120.dll
            msvcr120.dll
            ssleay32.dll
            zlib.dll

Другие вопросы по теме