Quarkus এবং AMQ অনলাইন ব্যবহার করে Red Hat OpenShift প্ল্যাটফর্মে ক্লাউড-নেটিভ মেসেজিং

হাই সব! এখানে এটি - কোয়ার্কাস সিরিজে আমাদের চূড়ান্ত পোস্ট! (প্রসঙ্গক্রমে, আমাদের ওয়েবিনার দেখুন "এটি কোয়ার্কাস - কুবারনেটেস নেটিভ জাভা ফ্রেমওয়ার্ক". আমরা আপনাকে দেখাব কিভাবে স্ক্র্যাচ থেকে শুরু করতে হয় বা রেডিমেড সমাধান স্থানান্তর করতে হয়)

Quarkus এবং AMQ অনলাইন ব্যবহার করে Red Hat OpenShift প্ল্যাটফর্মে ক্লাউড-নেটিভ মেসেজিং

В আগে এই পোস্টে, আমরা প্রাসঙ্গিক সরঞ্জামগুলি দেখেছি যা জাভা অ্যাপ্লিকেশনগুলির আধুনিকীকরণের ফলে প্রাপ্ত উন্নতিগুলি পরিমাপ করতে ব্যবহার করা যেতে পারে।

সংস্করণ 0.17.0 থেকে, কোয়ার্কাস অ্যাডভান্সড মেসেজ সারিবদ্ধ প্রোটোকলের ব্যবহার সমর্থন করে (এএমকিউপি), যা অ্যাপ্লিকেশন বা সংস্থার মধ্যে ব্যবসায়িক বার্তা স্থানান্তর করার জন্য একটি উন্মুক্ত মান।

রেড হ্যাট এএমকিউ অনলাইন একটি ওপেন সোর্স প্রকল্পের ভিত্তিতে নির্মিত একটি পরিষেবা EnMasse এবং একটি প্ল্যাটফর্ম-ভিত্তিক মেসেজিং প্রক্রিয়া বাস্তবায়ন করা রেড হ্যাট ওপেনশিফ্ট. এটি কিভাবে কাজ করে তার আরো বিস্তারিত জানার জন্য, দেখুন এখানে (EN). আজ আমরা আপনাকে দেখাব কিভাবে AMQ Online এবং Quarkus কে একত্রিত করে দুটি নতুন মেসেজিং প্রযুক্তি ব্যবহার করে একটি আধুনিক OpenShift-ভিত্তিক মেসেজিং সিস্টেম তৈরি করা যায়।

এটা ধরে নেওয়া হয় যে আপনি ইতিমধ্যেই OpenShift প্ল্যাটফর্মে AMQ অনলাইন স্থাপন করেছেন (যদি না হয়, তাহলে দেখুন ইনস্টলেশন গাইড).

শুরু করার জন্য, আমরা একটি কোয়ার্কাস অ্যাপ্লিকেশন তৈরি করব যা প্রতিক্রিয়াশীল মেসেজিং ব্যবহার করে একটি সাধারণ অর্ডার প্রক্রিয়াকরণ সিস্টেম হবে। এই অ্যাপ্লিকেশনটিতে একটি অর্ডার জেনারেটর অন্তর্ভুক্ত থাকবে যা একটি নির্দিষ্ট ব্যবধানে একটি বার্তা সারিতে অর্ডার পাঠায়, সেইসাথে একটি অর্ডার প্রসেসর যা সারি থেকে বার্তাগুলি প্রক্রিয়া করবে এবং ব্রাউজারে দৃশ্যমান নিশ্চিতকরণগুলি তৈরি করবে৷

একবার আমরা অ্যাপ্লিকেশনটি তৈরি করার পরে, আমরা আপনাকে দেখাব কিভাবে অ্যাপ্লিকেশনটিতে মেসেজিং সিস্টেম কনফিগারেশন এম্বেড করতে হয় এবং সিস্টেমে আমাদের প্রয়োজনীয় সংস্থানগুলি সরবরাহ করতে AMQ অনলাইন ব্যবহার করতে হয়।

কোয়ার্কাস অ্যাপ

আমাদের কোয়ার্কাস অ্যাপ্লিকেশনটি ওপেনশিফটে চলে এবং এটি প্রোগ্রামটির একটি পরিবর্তিত সংস্করণ amqp-কুইকস্টার্ট. ক্লায়েন্ট পক্ষের একটি সম্পূর্ণ উদাহরণ পাওয়া যাবে এখানে.

অর্ডার জেনারেটর

জেনারেটরটি একঘেয়েভাবে প্রতি 5 সেকেন্ডে "অর্ডার" ঠিকানায় ক্রমবর্ধমান অর্ডার আইডি পাঠায়।

@ApplicationScoped
public class OrderGenerator {
 
    private int orderId = 1;
 
    @Outgoing("orders")
    public Flowable<Integer> generate() {
        return Flowable.interval(5, TimeUnit.SECONDS)
        .map(tick -> orderId++);
    }
}

অর্ডার প্রসেসর

অর্ডার হ্যান্ডলারটি আরও সহজ, এটি কেবল "নিশ্চিতকরণ" ঠিকানায় একটি নিশ্চিতকরণ আইডি ফেরত দেয়।

@ApplicationScoped
public class OrderProcessor {
    @Incoming("orders")
    @Outgoing("confirmations")
    public Integer process(Integer order) {
        // Идентификатор подтверждения равен удвоенному идентификатору заказа <img draggable="false" class="emoji" alt=":-)" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f642.svg">
        return order * 2;
    }
}

নিশ্চিতকরণ সম্পদ

নিশ্চিতকরণ সংস্থানটি আমাদের অ্যাপ্লিকেশন দ্বারা উত্পন্ন নিশ্চিতকরণগুলি তালিকাভুক্ত করার জন্য একটি HTTP শেষ পয়েন্ট।

@Path("/confirmations")
public class ConfirmationResource {
 
    @Inject
    @Stream("confirmations") Publisher<Integer> orders;
 
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }
 
 
    @GET
    @Path("/stream")
    @Produces(MediaType.SERVER_SENT_EVENTS)
    public Publisher<Integer> stream() {
        return orders;
    }
}

সমন্বয়

AMQ অনলাইনের সাথে সংযোগ করতে, আমাদের অ্যাপ্লিকেশনটির কিছু কনফিগারেশন ডেটার প্রয়োজন হবে, যথা: কোয়ার্কাস সংযোগকারী কনফিগারেশন, AMQP এন্ডপয়েন্ট তথ্য এবং ক্লায়েন্ট শংসাপত্র। অবশ্যই, সমস্ত কনফিগারেশন ডেটা এক জায়গায় রাখা ভাল, তবে কোয়ার্কাস অ্যাপ্লিকেশন কনফিগার করার সম্ভাব্য বিকল্পগুলি দেখানোর জন্য আমরা ইচ্ছাকৃতভাবে সেগুলিকে আলাদা করব।

সংযোগকারী

একটি অ্যাপ্লিকেশন বৈশিষ্ট্য ফাইল ব্যবহার করে কম্পাইলের সময় সংযোগকারী কনফিগারেশন প্রদান করা যেতে পারে:

mp.messaging.outgoing.orders.connector=smallrye-amqp
mp.messaging.incoming.orders.connector=smallrye-amqp

জিনিসগুলি সহজ রাখতে, আমরা শুধুমাত্র "অর্ডার" ঠিকানার জন্য একটি বার্তা সারি ব্যবহার করব৷ এবং আমাদের অ্যাপ্লিকেশনে "নিশ্চিতকরণ" ঠিকানাটি মেমরিতে একটি সারি ব্যবহার করবে।

AMQP শেষ বিন্দু

কম্পাইলের সময়, AMQP এন্ডপয়েন্টের হোস্টনাম এবং পোর্ট নম্বর অজানা, তাই তাদের অবশ্যই ইনজেকশন দিতে হবে। এন্ডপয়েন্টটি কনফিগারম্যাপে সেট করা যেতে পারে যা AMQ অনলাইন দ্বারা তৈরি করা হয়েছে, তাই আমরা এপ্লিকেশন ম্যানিফেস্টে পরিবেশ ভেরিয়েবলের মাধ্যমে তাদের সংজ্ঞায়িত করব:

spec:
  template:
    spec:
      containers:
      - env:
        - name: AMQP_HOST
          valueFrom:
            configMapKeyRef:
              name: quarkus-config
              key: service.host
        - name: AMQP_PORT
          valueFrom:
            configMapKeyRef:
              name: quarkus-config
              key: service.port.amqp

শংসাপত্র

পরিষেবা অ্যাকাউন্ট টোকেনটি OpenShift-এ আমাদের আবেদনকে প্রমাণীকরণ করতে ব্যবহার করা যেতে পারে। এটি করার জন্য, আপনাকে প্রথমে একটি কাস্টম কনফিগসোর্স তৈরি করতে হবে যা পডের ফাইল সিস্টেম থেকে প্রমাণীকরণ টোকেন পড়বে:

public class MessagingCredentialsConfigSource implements ConfigSource {
    private static final Set<String> propertyNames;
 
    static {
        propertyNames = new HashSet<>();
        propertyNames.add("amqp-username");
        propertyNames.add("amqp-password");
    }
 
    @Override
    public Set<String> getPropertyNames() {
        return propertyNames;
    }
 
    @Override
    public Map<String, String> getProperties() {
        try {
            Map<String, String> properties = new HashMap<>();
            properties.put("amqp-username", "@@serviceaccount@@");
            properties.put("amqp-password", readTokenFromFile());
            return properties;
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }
 
    @Override
    public String getValue(String key) {
        if ("amqp-username".equals(key)) {
            return "@@serviceaccount@@";
        }
        if ("amqp-password".equals(key)) {
            try {
                return readTokenFromFile();
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        }
        return null;
    }
 
    @Override
    public String getName() {
        return "messaging-credentials-config";
    }
 
    private static String readTokenFromFile() throws IOException {
        return new String(Files.readAllBytes(Paths.get("/var/run/secrets/kubernetes.io/serviceaccount/token")), StandardCharsets.UTF_8);
    }
}

অ্যাপ্লিকেশনটি তৈরি করুন এবং স্থাপন করুন

যেহেতু অ্যাপ্লিকেশনটি একটি এক্সিকিউটেবল ফাইলে কম্পাইল করা আবশ্যক, একটি GraalVM ভার্চুয়াল মেশিন প্রয়োজন। এটির জন্য একটি পরিবেশ কীভাবে সেট আপ করতে হয় তার বিশদ বিবরণের জন্য, সংশ্লিষ্ট নির্দেশাবলী দেখুন কোয়ার্কাস গাইড.

তারপরে, সেখানে প্রদত্ত নির্দেশাবলী অনুসরণ করে, আপনাকে উত্সটি ডাউনলোড করতে হবে, আমাদের অ্যাপ্লিকেশন তৈরি করতে হবে এবং স্থাপন করতে হবে:

git clone https://github.com/EnMasseProject/enmasse-example-clients
cd enmasse-example-clients/quarkus-example-client
oc new-project myapp
mvn -Pnative -Dfabric8.mode=openshift -Dfabric8.build.strategy=docker package fabric8:build fabric8:resource fabric8:apply

এই কমান্ডগুলির পরে, অ্যাপ্লিকেশনটি স্থাপন করা হবে, তবে আমরা AMQ অনলাইনে আমাদের প্রয়োজনীয় মেসেজিং সংস্থানগুলি কনফিগার না করা পর্যন্ত শুরু হবে না।

মেসেজিং সিস্টেম সেট আপ করা হচ্ছে

এখন যা বাকি আছে তা হল মেসেজিং সিস্টেমে আমাদের অ্যাপ্লিকেশনের প্রয়োজনীয় সংস্থানগুলি সেট করা। এটি করার জন্য, আপনাকে তৈরি করতে হবে: 1) মেসেজিং সিস্টেমের শেষ পয়েন্ট শুরু করার জন্য একটি ঠিকানা স্থান; 2) অ্যাড্রেস কনফিগার করার জন্য ঠিকানা যা আমরা অ্যাপ্লিকেশনে ব্যবহার করি; 3) মেসেজিং ব্যবহারকারী ক্লায়েন্ট শংসাপত্র সেট করতে.

ঠিকানার স্থান

AMQ অনলাইনে একটি AddressSpace অবজেক্ট হল ঠিকানাগুলির একটি গ্রুপ যা সংযোগের শেষ পয়েন্ট এবং প্রমাণীকরণ এবং অনুমোদন নীতিগুলি ভাগ করে। যখন আপনি একটি ঠিকানার স্থান তৈরি করবেন, তখন আপনি নির্দিষ্ট করতে পারেন কিভাবে মেসেজিং এন্ডপয়েন্টগুলি প্রকাশ করা হবে:

apiVersion: enmasse.io/v1beta1
kind: AddressSpace
metadata:
  name: quarkus-example
spec:
  type: brokered
  plan: brokered-single-broker
  endpoints:
  - name: messaging
    service: messaging
    exports:
    - name: quarkus-config
      kind: configmap

ঠিকানা

ঠিকানাগুলি বার্তা পাঠাতে এবং গ্রহণ করতে ব্যবহৃত হয়। প্রতিটি ঠিকানার একটি প্রকার রয়েছে, যা এর শব্দার্থবিদ্যা নির্ধারণ করে, সেইসাথে একটি পরিকল্পনা, যা সংরক্ষিত সম্পদের সংখ্যা নির্দিষ্ট করে। ঠিকানা নির্ধারণ করা যেতে পারে, উদাহরণস্বরূপ, এই মত:

apiVersion: enmasse.io/v1beta1
kind: Address
metadata:
  name: quarkus-example.orders
spec:
  address: orders
  type: queue
  plan: brokered-queue

মেসেজিং ব্যবহারকারী

শুধুমাত্র বিশ্বস্ত অ্যাপ্লিকেশনগুলি আপনার ঠিকানাগুলিতে বার্তা পাঠাতে এবং গ্রহণ করতে পারে তা নিশ্চিত করতে, আপনাকে অবশ্যই মেসেজিং সিস্টেমে একজন ব্যবহারকারী তৈরি করতে হবে৷ একটি ক্লাস্টারে চলমান অ্যাপ্লিকেশনগুলির জন্য, ক্লায়েন্টদের একটি OpenShift পরিষেবা অ্যাকাউন্ট ব্যবহার করে প্রমাণীকরণ করা যেতে পারে। ব্যবহারকারী "পরিষেবা অ্যাকাউন্ট" সংজ্ঞায়িত করা যেতে পারে, উদাহরণস্বরূপ, এইরকম:

apiVersion: user.enmasse.io/v1beta1
kind: MessagingUser
metadata:
  name: quarkus-example.app
spec:
  username: system:serviceaccount:myapp:default
  authentication:
    type: serviceaccount
  authorization:
  - operations: ["send", "recv"]
    addresses: ["orders"]

অ্যাপ্লিকেশন কনফিগার করার অনুমতি

AMQ অনলাইনের জন্য কনফিগারম্যাপ তৈরি করার জন্য যা আমরা AMQP এন্ডপয়েন্ট তথ্য এম্বেড করতে ব্যবহার করেছি, ভূমিকা এবং ভূমিকা বাইন্ডিং সেট করতে হবে:

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: quarkus-config
spec:
  rules:
  - apiGroups: [ "" ]
    resources: [ "configmaps" ]
    verbs: [ "create" ]
  - apiGroups: [ "" ]
    resources: [ "configmaps" ]
    resourceNames: [ "quarkus-config" ]
    verbs: [ "get", "update", "patch" ]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: quarkus-config
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: quarkus-config
subjects:
- kind: ServiceAccount
  name: address-space-controller
  namespace: amq-online-infra

কীভাবে কনফিগারেশন প্রয়োগ করবেন

আপনি এই মত মেসেজিং সিস্টেম কনফিগারেশন প্রয়োগ করতে পারেন:

cd enmasse-example-clients/quarkus-example-client
oc project myapp
oc apply -f src/main/resources/k8s/addressspace
oc apply -f src/main/resources/k8s/address

আবেদন যাচাই

অ্যাপ্লিকেশনটি শুরু হয়েছে তা নিশ্চিত করতে, সবার আগে, সংশ্লিষ্ট ঠিকানাগুলি তৈরি করা হয়েছে এবং সক্রিয় আছে কিনা তা পরীক্ষা করা যাক:

until [[ `oc get address quarkus-example.prices -o jsonpath='{.status.phase}'` == "Active" ]]; do echo "Not yet ready"; sleep 5; done

তারপরে অ্যাপ্লিকেশান রুট ইউআরএল চেক করা যাক (ব্রাউজারে এই ঠিকানাটি খুলুন):

echo "http://$(oc get route quarkus-example-client -o jsonpath='{.spec.host}')/prices.html"

ব্রাউজারটি দেখাতে হবে যে টিকিটগুলি পর্যায়ক্রমে আপডেট করা হয় কারণ বার্তাগুলি AMQ অনলাইন দ্বারা পাঠানো এবং গ্রহণ করা হয়।

বুদ্ধিমান

তাই আমরা একটি কোয়ার্কাস অ্যাপ্লিকেশন লিখেছি যা বার্তা প্রেরণের জন্য AMQP ব্যবহার করে, অ্যাপ্লিকেশনটিকে Red Hat OpenShift প্ল্যাটফর্মে চালানোর জন্য কনফিগার করে এবং AMQ অনলাইন কনফিগারেশনের উপর ভিত্তি করে এটির কনফিগারেশন প্রয়োগ করে। তারপরে আমরা আমাদের অ্যাপ্লিকেশনের জন্য মেসেজিং সিস্টেম শুরু করার জন্য প্রয়োজনীয় ম্যানিফেস্ট তৈরি করেছি।

এটি কোয়ার্কাস সম্পর্কে সিরিজটি শেষ করেছে, তবে সামনে অনেক নতুন এবং আকর্ষণীয় জিনিস রয়েছে, সাথে থাকুন!

উত্স: www.habr.com

একটি মন্তব্য জুড়ুন