Я пытаюсь запустить образец кода Кафка в среде единства, и по этой причине я создал клиент потребитель (код приведен ниже).
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.IEnumerable
1[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.
librdkafkacpp
msvcr120
Теперь проблема в том, что мой проект зависает всякий раз, когда я пытаюсь его воспроизвести.
Помните: я загрузил все эти dll через nuget в vs 2017. Затем я объединил эти dll в единство.





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

Теперь вы можете запустить мой пример кода (упомянутый в вопросе).
ПРИМЕЧАНИЕ: После сборки плеера вам необходимо вручную скопировать 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:
Либо нужно скопировать в ту же папку, где остается 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
На самом деле, я не могу себе представить ситуацию, когда приложению Unity3d нужен клиент Kafka внутри. Вы пытаетесь создать мобильный (ПК, Xbox, что угодно) клиент, который отправляет некоторые данные непосредственно брокеру Kafka?