java - মরফ - ফ্রানৎস কাফকা গল্প সমগ্র pdf
স্থানীয় মেশিন থেকে ডকারে চলমান কাফকার সাথে সংযুক্ত হন (2)
আমি আমার স্থানীয় মেশিনে ডকার ব্যবহার করে সিঙ্গল নোড বেসিক কাফকা স্থাপনার সেটআপ করি যেমন এটি কনফ্লুয়েন্ট কাফকা ডকুমেন্টেশনে বর্ণিত হয় (পদক্ষেপ ২-৩)
তদতিরিক্ত, আমি চিড়িয়াখানার বন্দরের 2181 এবং কাফকার বন্দর 9092ও উন্মুক্ত করেছি যাতে আমি তাদের সাথে স্থানীয় মেশিনে চলমান জাভা ক্লায়েন্টের সাথে সংযোগ করতে সক্ষম হব:
$ docker run -d \
-p 2181:2181 \
--net=confluent \
--name=zookeeper \
-e ZOOKEEPER_CLIENT_PORT=2181 \
confluentinc/cp-zookeeper:4.1.0
$ docker run -d \
--net=confluent \
--name=kafka \
-p 9092:9092 \
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092 \
-e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
confluentinc/cp-kafka:4.1.0
সমস্যা: আমি যখন হোস্ট মেশিন থেকে কাফকার সাথে সংযোগ করার চেষ্টা করি তখন সংযোগ ব্যর্থ হয় কারণ এটি ঠিকানাটি সমাধান করতে পারে না: কাফকা: 9092।
আমার জাভা কোডটি এখানে:
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("client.id", "KafkaExampleProducer");
props.put("key.serializer", LongSerializer.class.getName());
props.put("value.serializer", StringSerializer.class.getName());
KafkaProducer<Long, String> producer = new KafkaProducer<>(props);
ProducerRecord<Long, String> record = new ProducerRecord<>("foo", 1L, "Test 1");
producer.send(record).get();
producer.flush();
ব্যতিক্রম:
java.io.IOException: Can't resolve address: kafka:9092
at org.apache.kafka.common.network.Selector.doConnect(Selector.java:235) ~[kafka-clients-2.0.0.jar:na]
at org.apache.kafka.common.network.Selector.connect(Selector.java:214) ~[kafka-clients-2.0.0.jar:na]
at org.apache.kafka.clients.NetworkClient.initiateConnect(NetworkClient.java:864) [kafka-clients-2.0.0.jar:na]
at org.apache.kafka.clients.NetworkClient.ready(NetworkClient.java:265) [kafka-clients-2.0.0.jar:na]
at org.apache.kafka.clients.producer.internals.Sender.sendProducerData(Sender.java:266) [kafka-clients-2.0.0.jar:na]
at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:238) [kafka-clients-2.0.0.jar:na]
at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:176) [kafka-clients-2.0.0.jar:na]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_144]
Caused by: java.nio.channels.UnresolvedAddressException: null
at sun.nio.ch.Net.checkAddress(Net.java:101) ~[na:1.8.0_144]
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:622) ~[na:1.8.0_144]
at org.apache.kafka.common.network.Selector.doConnect(Selector.java:233) ~[kafka-clients-2.0.0.jar:na]
... 7 common frames omitted
প্রশ্ন: হোস্ট মেশিন থেকে ডকারে চলমান কাফকার সাথে কীভাবে যোগাযোগ করবেন?
দ্রষ্টব্য: আমি জানি যে আমি তাত্ত্বিকভাবে ডিএনএস সেটআপ এবং
/etc/hosts
সাথে ঘুরেফিরে খেলতে পারি তবে এটি কার্যকর নয় - এটি এমন হওয়া উচিত নয়।
এখানে অনুরূপ প্রশ্ন
here
, তবে এটি
ches/kafka
চিত্রের উপর ভিত্তি করে।
আমি
confluent
ভিত্তিক চিত্র ব্যবহার করি যা একই নয়।
দাবি
wurstmeister/kafka
নয়,wurstmeister/kafka
ডকার ইমেজ ব্যবহার করা হয়েছে , যদিও একই রকম কনফিগারেশন রয়েছে , আমি এটি চেষ্টা করে দেখিনি। যদি সেই চিত্রটি ব্যবহার করা হয় তবে তাদের সংযোগের উইকিটি পড়ুন ।
debezium/kafka
ডকস উল্লেখ করা হয়েছে ।আমি
bitnami
কাফকা চিত্রগুলি চেষ্টা করেছি এবং এই সেটিংসটি দিয়ে কাজ করতে পেরেছিদিন শেষে, এটি একই পাত্রে চলমান একই অ্যাপাচি কাফকা । এটি কীভাবে কনফিগার করা হয়েছে তার উপরে আপনি নির্ভরশীল।
পরিপূরক পাঠ এবং নেটওয়ার্ক ডায়াগ্রামের জন্য, এই ব্লগটি @rmoff দেখুন
এই কনফ্লুয়েন্ট কুইকস্টার্ট ডকুমেন্টটি সমস্ত উত্পাদন এবং গ্রাহক অনুরোধগুলি ডকার নেটওয়ার্কের মধ্যে অনুমান করবে।
আপনি নিজের কাফকা ক্লায়েন্ট কোডটিকে তার নিজস্ব ধারকটিতে চালিয়ে সমস্যার সমাধান করতে পারতেন, তবে অন্যথায় আপনাকে কন্টেইনারটি বহিরাগতভাবে প্রকাশের জন্য আরও কিছু পরিবেশের ভেরিয়েবল যুক্ত করতে হবে, যদিও এটি ডকার নেটওয়ার্কের মধ্যে কাজ করার পরেও।
প্রথমে
PLAINTEXT_HOST:PLAINTEXT
একটি প্রোটোকল ম্যাপিং যুক্ত করুন
PLAINTEXT_HOST:PLAINTEXT
যা শ্রোতাদের প্রোটোকলকে কাফকা প্রোটোকলে মানচিত্রযুক্ত করবে
-e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
তারপরে বিভিন্ন বন্দরে দু'জন বিজ্ঞাপনদাতাকে সেটআপ করুন।
(
kafka:9092
এখানে ডকারের ধারকটির নাম উল্লেখ করে)।
প্রোটোকলগুলি উপরের ম্যাপিংয়ের ডান দিকের মানগুলির সাথে মেলে খেয়াল করুন
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
-p 29092:29092
চালানোর সময়, হোস্ট পোর্ট ম্যাপিংয়ের জন্য
-p 29092:29092
tl; dr (উপরের সেটিংস সহ)
ডকার নেটওয়ার্কের
বাইরে
যে কোনও কাফকা ক্লায়েন্ট চালানোর সময় (আপনি স্থানীয়ভাবে ইনস্টল করে থাকতে পারেন এমন
localhost:29092
সহ) বুটস্ট্র্যাপ সার্ভারের জন্য
localhost:29092
এবং
localhost:29092
জন্য
localhost:2181
ব্যবহার করুন
ডকার নেটওয়ার্কে
কোনও অ্যাপ্লিকেশন চালানোর সময়, বুটস্ট্র্যাপ সার্ভারের জন্য
kafka:9092
এবং
zookeeper:2181
ব্যবহার করুন
সম্পূর্ণ কনফ্লুয়েন্ট স্ট্যাকের জন্য উদাহরণ রচনা ফাইলটি দেখুন
আপনি যখন প্রথম কোনও কাফকা নোডের সাথে সংযুক্ত হন, এটি আপনাকে সমস্ত কাফকা নোড এবং ইউআরএল কোথায় সংযুক্ত করতে হবে তা ফিরিয়ে দেবে। তারপরে আপনার অ্যাপ্লিকেশনটি প্রতিটি কাফকার সাথে সরাসরি সংযোগ করার চেষ্টা করবে।
ইস্যুটি সর্বদা কাফকা আপনাকে ইউআরএল হিসাবে দেবে কি?
এটি কেন
KAFKA_ADVERTISED_LISTENERS
যা
KAFKA_ADVERTISED_LISTENERS
ব্যবহার করে বিশ্বকে কীভাবে এটি অ্যাক্সেস করা যায় তা জানাতে ব্যবহার করবে।
এখন আপনার ব্যবহারের ক্ষেত্রে, একাধিক ছোট জিনিস ভেবে দেখার দরকার আছে:
যাক আপনি
plaintext://kafka:9092
সেট করেছেন
plaintext://kafka:9092
- আপনার ডকার রচনায় কাফকা ব্যবহার করার অনুরোধ থাকলে আপনার কাছে এটি ঠিক আছে। এই অ্যাপ্লিকেশনটি কাফকার থেকে কাফকার ইউআরএল পাবেন যা ডকার নেটওয়ার্কের মাধ্যমে সমাধানযোগ্য।
-
যদি আপনি আপনার প্রধান সিস্টেম থেকে বা একই ডকার নেটওয়ার্কে নেই এমন কোনও ধারক থেকে সংযোগ স্থাপনের চেষ্টা করেন তবে এটি ব্যর্থ হবে, কারণ
kafka
নামটি সমাধান করা যায় না।
==> এটি ঠিক করার জন্য আপনার কোনও পরিষেবা আবিষ্কারের মতো একটি নির্দিষ্ট ডিএনএস সার্ভার থাকা দরকার তবে এটি ছোট জিনিসগুলির জন্য বড় সমস্যা।
অথবা আপনি প্রতিটি
/etc/hosts
ম্যানুয়ালি
kafka
নামটি ধারক
kafka
সেট করেছেন
আপনি যদি
plaintext://localhost:9092
সেট করেন
plaintext://localhost:9092
- আপনার সিস্টেমে এটি ঠিক আছে যদি আপনার কাছে বন্দর ম্যাপিং থাকে (-কা 9092: 9092 কাফকা চালু করার সময়)
- আপনি যদি কোনও ধারক (একই ডকার নেটওয়ার্ক বা না) এর অ্যাপ্লিকেশন থেকে পরীক্ষা করেন তবে এটি ব্যর্থ হবে (লোকালহোস্ট নিজেই সেই ধারক যা কাফকা নয়)
==> যদি আপনার কাছে এটি থাকে এবং অন্য কোনও পাত্রে কাফকা ক্লায়েন্ট ব্যবহার করতে চান তবে এটির সমাধানের একটি উপায় হ'ল উভয় ধারক (একই আইপি) এর জন্য নেটওয়ার্ক ভাগ করে নেওয়া
শেষ বিকল্প: নামে একটি আইপি সেট করুন:
plaintext://xyza:9092
এটি সবার জন্য ঠিক থাকবে ... তবে কীভাবে আপনি জাইজা নামটি পেতে পারেন?
আপনি কন্টেইনারটি চালু করার সময় এই
docker run .... --net confluent --ip 10.xyz ...
হার্ডকোড করার একমাত্র উপায় হ'ল:
docker run .... --net confluent --ip 10.xyz ...
মনে রাখবেন যে আপনাকে আইপি
confluent
সাবনেটে একটি বৈধ আইপি-র সাথে মানিয়ে নিতে হবে।