Google ক্লাউডে বসন্ত নেটিভ

1। সংক্ষিপ্ত বিবরণ

এই কোডল্যাবে, আমরা স্প্রিং নেটিভ প্রকল্প সম্পর্কে শিখব, এটি ব্যবহার করে এমন একটি অ্যাপ তৈরি করব এবং এটিকে Google ক্লাউডে স্থাপন করব।

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

স্প্রিং নেটিভ প্রকল্পটি বর্তমানে একটি পরীক্ষামূলক পর্যায়ে রয়েছে, তাই এটি শুরু করার জন্য কিছু নির্দিষ্ট কনফিগারেশনের প্রয়োজন হবে৷ যাইহোক, SpringOne 2021-এ ঘোষিত হিসাবে, স্প্রিং নেটিভ স্প্রিং ফ্রেমওয়ার্ক 6.0 এবং স্প্রিং বুট 3.0-এ প্রথম শ্রেণীর সমর্থন সহ একীভূত হতে সেট করা হয়েছে, তাই এটি রিলিজের কয়েক মাস আগে প্রকল্পটি ঘনিষ্ঠভাবে দেখার জন্য উপযুক্ত সময়।

যদিও জাস্ট-ইন-টাইম সংকলনটি দীর্ঘ চলমান প্রক্রিয়াগুলির মতো জিনিসগুলির জন্য খুব ভালভাবে অপ্টিমাইজ করা হয়েছে, কিছু নির্দিষ্ট ব্যবহারের ক্ষেত্রে রয়েছে যেখানে সময়ের আগে সংকলিত অ্যাপ্লিকেশনগুলি আরও ভাল কাজ করে, যা আমরা কোডল্যাবের সময় আলোচনা করব।

আপনি কিভাবে শিখবেন

  • ক্লাউড শেল ব্যবহার করুন
  • Cloud Run API সক্ষম করুন
  • একটি স্প্রিং নেটিভ অ্যাপ তৈরি করুন এবং স্থাপন করুন
  • ক্লাউড রানে এমন একটি অ্যাপ স্থাপন করুন

আপনি কি প্রয়োজন হবে

জরিপ

আপনি কিভাবে এই টিউটোরিয়াল ব্যবহার করবেন?

শুধুমাত্র মাধ্যমে এটি পড়ুন এটি পড়ুন এবং ব্যায়াম সম্পূর্ণ করুন

জাভা নিয়ে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

নবজাতক মধ্যবর্তী দক্ষ

আপনি Google ক্লাউড পরিষেবাগুলি ব্যবহার করার সাথে আপনার অভিজ্ঞতাকে কীভাবে মূল্যায়ন করবেন?

নবজাতক মধ্যবর্তী দক্ষ

2. পটভূমি

স্প্রিং নেটিভ প্রজেক্টটি ডেভেলপারদের কাছে নেটিভ অ্যাপ্লিকেশন পারফরম্যান্স প্রদান করতে বিভিন্ন প্রযুক্তি ব্যবহার করে।

স্প্রিং নেটিভকে সম্পূর্ণরূপে বোঝার জন্য, এই উপাদানগুলির কয়েকটি প্রযুক্তি, তারা আমাদের জন্য কী সক্ষম করে এবং কীভাবে তারা এখানে একসাথে কাজ করে তা বোঝা সহায়ক।

AOT সংকলন

যখন ডেভেলপাররা সাধারণত কম্পাইলের সময় javac চালায়, তখন আমাদের .java সোর্স কোড .class ফাইলে কম্পাইল করা হয় যা বাইটকোডে লেখা থাকে। এই বাইটকোডটি শুধুমাত্র জাভা ভার্চুয়াল মেশিন দ্বারা বোঝার জন্য, তাই আমাদের কোড চালানোর জন্য JVM-কে অন্যান্য মেশিনে এই কোডটি ব্যাখ্যা করতে হবে।

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

সৌভাগ্যবশত, JVM-এর বেশিরভাগ বাস্তবায়ন এই ব্যাখ্যার খরচ কমানোর জন্য ঠিক সময়ে সংকলন ব্যবহার করে। এটি একটি ফাংশনের জন্য আমন্ত্রণগুলি গণনা করে অর্জন করা হয়, এবং যদি এটি প্রায়শই একটি থ্রেশহোল্ড ( ডিফল্ট 10,000 ) পাস করার জন্য যথেষ্ট আহ্বান করা হয় তবে এটি আরও ব্যয়বহুল ব্যাখ্যা রোধ করতে রান টাইমে নেটিভ কোডে কম্পাইল করা হয়।

কম্পাইলের সময়ে একটি নেটিভ এক্সিকিউটেবলে সমস্ত পৌঁছানো যায় এমন কোড কম্পাইল করে, আগাম-অব-টাইম সংকলন বিপরীত পদ্ধতি গ্রহণ করে। এটি মেমরি দক্ষতা এবং রান টাইমে অন্যান্য কর্মক্ষমতা লাভের জন্য বহনযোগ্যতার ব্যবসা করে।

5042e8e62a05a27.png

এটি অবশ্যই একটি ট্রেড অফ, এবং সবসময় নেওয়ার যোগ্য নয়। যাইহোক, AOT সংকলন নির্দিষ্ট ব্যবহারের ক্ষেত্রে উজ্জ্বল হতে পারে যেমন:

  • স্বল্পস্থায়ী অ্যাপ্লিকেশন যেখানে স্টার্টআপ সময় গুরুত্বপূর্ণ
  • উচ্চ মেমরি সীমাবদ্ধ পরিবেশ যেখানে JIT খুব ব্যয়বহুল হতে পারে

একটি মজার ঘটনা হিসাবে, AOT সংকলনটি JDK 9-এ একটি পরীক্ষামূলক বৈশিষ্ট্য হিসাবে প্রবর্তিত হয়েছিল, যদিও এই বাস্তবায়নটি বজায় রাখা ব্যয়বহুল ছিল, এবং কখনই এটি পুরোপুরি ধরা পড়েনি, তাই এটিকে জাভা 17 এ শান্তভাবে সরিয়ে দেওয়া হয়েছিল শুধুমাত্র GraalVM ব্যবহার করে ডেভেলপারদের পক্ষে।

GraalVM

GraalVM হল একটি অত্যন্ত অপ্টিমাইজ করা ওপেন সোর্স JDK ডিস্ট্রিবিউশন যা অত্যন্ত দ্রুত স্টার্টআপ টাইম, AOT নেটিভ ইমেজ সংকলন, এবং পলিগ্লট ক্ষমতা নিয়ে গর্ব করে যা ডেভেলপারদেরকে একটি একক অ্যাপ্লিকেশনে একাধিক ভাষা মিশ্রিত করতে দেয়।

GraalVM সক্রিয় বিকাশে রয়েছে, নতুন ক্ষমতা অর্জন করছে এবং বিদ্যমানগুলিকে সর্বদা উন্নত করছে, তাই আমি বিকাশকারীদের সাথে থাকার জন্য উত্সাহিত করি।

সাম্প্রতিক কিছু মাইলফলক হল:

  • একটি নতুন, ব্যবহারকারী বান্ধব নেটিভ ইমেজ বিল্ড আউটপুট ( 2021-01-18 )
  • জাভা 17 সমর্থন ( 2022-01-18 )
  • পলিগ্লট কম্পাইলের সময় উন্নত করতে ডিফল্টরূপে বহু-স্তরের সংকলন সক্ষম করা হচ্ছে ( 2021-04-20 )

বসন্ত নেটিভ

সহজ কথায় - স্প্রিং নেটিভ স্প্রিং অ্যাপ্লিকেশনগুলিকে নেটিভ এক্সিকিউটেবলে পরিণত করতে GraalVM-এর নেটিভ-ইমেজ কম্পাইলার ব্যবহার করতে সক্ষম করে।

এন্ট্রি পয়েন্ট থেকে আপনার অ্যাপ্লিকেশানে পৌঁছানো যায় এমন সমস্ত পদ্ধতি খুঁজে পেতে কম্পাইলের সময়ে আপনার অ্যাপ্লিকেশনটির একটি স্ট্যাটিক বিশ্লেষণ সম্পাদন করা এই প্রক্রিয়ার অন্তর্ভুক্ত।

এটি মূলত আপনার অ্যাপ্লিকেশনের একটি "ক্লোজড-ওয়ার্ল্ড" ধারণা তৈরি করে, যেখানে সমস্ত কোড কম্পাইলের সময় পরিচিত বলে ধরে নেওয়া হয় এবং রানটাইমে কোনও নতুন কোড লোড করার অনুমতি দেওয়া হয় না।

এটা মনে রাখা গুরুত্বপূর্ণ যে নেটিভ ইমেজ জেনারেশন একটি মেমরি ইনটেনসিভ প্রক্রিয়া যা একটি নিয়মিত অ্যাপ্লিকেশন কম্পাইল করার চেয়ে বেশি সময় নেয় এবং জাভা-এর নির্দিষ্ট কিছু দিকের উপর সীমাবদ্ধতা আরোপ করে।

কিছু ক্ষেত্রে, স্প্রিং নেটিভের সাথে কাজ করার জন্য একটি অ্যাপ্লিকেশনের জন্য কোনো কোড পরিবর্তনের প্রয়োজন নেই। যাইহোক, কিছু পরিস্থিতিতে সঠিকভাবে কাজ করার জন্য নির্দিষ্ট নেটিভ কনফিগারেশন প্রয়োজন। এই পরিস্থিতিতে, স্প্রিং নেটিভ প্রায়শই এই প্রক্রিয়াটিকে সহজ করার জন্য নেটিভ ইঙ্গিত দেয়।

3. সেটআপ/প্রিওয়ার্ক

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

1. প্রকল্প তৈরি করা

আমরা start.spring.io থেকে আমাদের অ্যাপ পেয়ে শুরু করব:

curl https://start.spring.io/starter.zip -d dependencies=web \
           -d javaVersion=11 \
           -d bootVersion=2.6.4 -o io-native-starter.zip

এই স্টার্টার অ্যাপটি স্প্রিং বুট 2.6.4 ব্যবহার করে, যেটি সর্বশেষ সংস্করণ যা স্প্রিং-নেটিভ প্রজেক্ট লেখার সময় সমর্থন করে

মনে রাখবেন যে GraalVM 21.0.3 প্রকাশের পর থেকে আপনি এই নমুনার জন্য Java 17 ব্যবহার করতে পারেন। আমরা এখনও এই টিউটোরিয়ালের জন্য জাভা 11 ব্যবহার করব যাতে জড়িত কনফিগারেশনটি কমিয়ে আনা যায়।

কমান্ড লাইনে আমাদের জিপ হয়ে গেলে, আমরা আমাদের প্রকল্পের জন্য একটি সাবডিরেক্টরি তৈরি করতে পারি এবং সেখানে ফোল্ডারটি আনজিপ করতে পারি:

mkdir spring-native

cd spring-native

unzip ../io-native-starter.zip

2. কোড পরিবর্তন

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

এটি মেলানোর জন্য DemoApplication.java সম্পাদনা করুন:

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.Duration;
import java.time.Instant;

@RestController
@SpringBootApplication
public class DemoApplication {
    private static Instant startTime;
    private static Instant readyTime;

    public static void main(String[] args) {
        startTime = Instant.now();
                SpringApplication.run(DemoApplication.class, args);
    }

    @GetMapping("/")
    public String index() {
        return "Time between start and ApplicationReadyEvent: "
                + Duration.between(startTime, readyTime).toMillis()
                + "ms";
    }

    @EventListener(ApplicationReadyEvent.class)
    public void ready() {
                readyTime = Instant.now();
    }
}

এই মুহুর্তে আমাদের বেসলাইন অ্যাপটি যাওয়ার জন্য প্রস্তুত, তাই আমরা এটিকে একটি নেটিভ অ্যাপ্লিকেশনে রূপান্তর করার আগে স্টার্টআপের সময় সম্পর্কে ধারণা পেতে নির্দ্বিধায় একটি ছবি তৈরি করুন এবং স্থানীয়ভাবে এটি চালান।

আমাদের ইমেজ তৈরি করতে:

mvn spring-boot:build-image

বেসলাইন ইমেজের আকার সম্পর্কে ধারণা পেতে আপনি docker images demo ব্যবহার করতে পারেন: 6ecb403e9af1475e.png

আমাদের অ্যাপ চালানোর জন্য:

docker run --rm -p 8080:8080 demo:0.0.1-SNAPSHOT

3. বেসলাইন অ্যাপ স্থাপন করুন

এখন যেহেতু আমাদের অ্যাপ রয়েছে আমরা এটি স্থাপন করব এবং সময়গুলি নোট করব, যা আমরা পরবর্তীতে আমাদের নেটিভ অ্যাপ স্টার্টআপ সময়ের সাথে তুলনা করব।

আপনি যে ধরনের অ্যাপ্লিকেশন তৈরি করছেন তার উপর নির্ভর করে আপনার স্টাফ হোস্টিং করার জন্য বিভিন্ন ধরণের রয়েছে।

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

আপনি যদি আপনার নিজের মেশিনে অনুসরণ করছেন, তাহলে নিশ্চিত করুন যে gcloud CLI টুলটি ইনস্টল এবং আপডেট করা আছে।

আপনি যদি ক্লাউড শেলে থাকেন তবে সমস্ত যত্ন নেওয়া হবে এবং আপনি কেবল উত্স ডিরেক্টরিতে নিম্নলিখিতগুলি চালাতে পারেন:

gcloud run deploy

4. অ্যাপ্লিকেশন কনফিগারেশন

1. আমাদের Maven সংগ্রহস্থল কনফিগার করা

যেহেতু এই প্রকল্পটি এখনও পরীক্ষামূলক পর্যায়ে রয়েছে, তাই ম্যাভেনের কেন্দ্রীয় সংগ্রহস্থলে উপলব্ধ নয় এমন পরীক্ষামূলক শিল্পকর্মগুলি খুঁজে পেতে আমাদের অ্যাপটিকে কনফিগার করতে হবে।

এটি আমাদের pom.xml-এ নিম্নলিখিত উপাদানগুলি যুক্ত করবে, যা আপনি আপনার পছন্দের সম্পাদকে করতে পারেন।

আমাদের পোমে নিম্নলিখিত সংগ্রহস্থল এবং প্লাগইন রিপোজিটরি বিভাগগুলি যুক্ত করুন:

<repositories>
    <repository>
        <id>spring-release</id>
        <name>Spring release</name>
        <url>https://repo.spring.io/release</url>
    </repository>
</repositories>

<pluginRepositories>
    <pluginRepository>
        <id>spring-release</id>
        <name>Spring release</name>
        <url>https://repo.spring.io/release</url>
    </pluginRepository>
</pluginRepositories>

2. আমাদের নির্ভরতা যোগ করা

এর পরে, স্প্রিং-নেটিভ নির্ভরতা যোগ করুন, যা একটি নেটিভ ইমেজ হিসাবে একটি স্প্রিং অ্যাপ্লিকেশন চালানোর জন্য প্রয়োজন। দ্রষ্টব্য: আপনি যদি Gradle ব্যবহার করেন তবে এই পদক্ষেপটি প্রয়োজনীয় নয়

<dependencies>
    <!-- ... -->
    <dependency>
        <groupId>org.springframework.experimental</groupId>
        <artifactId>spring-native</artifactId>
        <version>0.11.2</version>
    </dependency>
</dependencies>

3. আমাদের প্লাগইন যোগ/সক্রিয় করা

নেটিভ ইমেজ সামঞ্জস্যতা এবং পদচিহ্ন উন্নত করতে এখন AOT প্লাগইন যুক্ত করুন ( আরও পড়ুন ):

<plugins>
    <!-- ... -->
    <plugin>
        <groupId>org.springframework.experimental</groupId>
        <artifactId>spring-aot-maven-plugin</artifactId>
        <version>0.11.2</version>
        <executions>
            <execution>
                <id>generate</id>
                <goals>
                    <goal>generate</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

এখন আমরা নেটিভ ইমেজ সমর্থন সক্ষম করতে স্প্রিং-বুট-মাভেন-প্লাগইন আপডেট করব এবং আমাদের নেটিভ ইমেজ তৈরি করতে পাকেটো বিল্ডার ব্যবহার করব:

<plugins>
    <!-- ... -->
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <image>
                <builder>paketobuildpacks/builder:tiny</builder>
                <env>
                    <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
                </env>
            </image>
        </configuration>
    </plugin>    
</plugins>

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

উদাহরণস্বরূপ আপনি যদি এমন একটি অ্যাপ তৈরি করছেন যার জন্য কিছু সাধারণ সি লাইব্রেরিতে অ্যাক্সেস প্রয়োজন, বা আপনি এখনও আপনার অ্যাপের প্রয়োজনীয়তা সম্পর্কে নিশ্চিত না হন, তাহলে পূর্ণ-নির্মাতা আরও উপযুক্ত হতে পারে।

5. নেটিভ অ্যাপ তৈরি করুন এবং চালান

সব ঠিক হয়ে গেলে, আমাদের ইমেজ তৈরি করতে এবং আমাদের নেটিভ, কম্পাইল করা অ্যাপ চালাতে সক্ষম হওয়া উচিত।

বিল্ড চালানোর আগে, এখানে কয়েকটি বিষয় মনে রাখতে হবে:

  • এটি একটি নিয়মিত নির্মাণের চেয়ে বেশি সময় নেবে (কয়েক মিনিট) d420322893640701.png
  • এই বিল্ড প্রক্রিয়াটি অনেক মেমরি নিতে পারে (কয়েক গিগাবাইট) cda24e1eb11fdbea.png
  • এই বিল্ড প্রক্রিয়ার জন্য ডকার ডেমন পৌঁছানো প্রয়োজন
  • এই উদাহরণে আমরা ম্যানুয়ালি প্রক্রিয়াটির মধ্য দিয়ে যাচ্ছি, আপনি স্বয়ংক্রিয়ভাবে একটি নেটিভ বিল্ড প্রোফাইল ট্রিগার করতে আপনার বিল্ড ফেজগুলি কনফিগার করতে পারেন।

আমাদের ইমেজ তৈরি করতে:

mvn spring-boot:build-image

এটি তৈরি হয়ে গেলে, আমরা নেটিভ অ্যাপটি কার্যকর দেখতে প্রস্তুত!

আমাদের অ্যাপ চালানোর জন্য:

docker run --rm -p 8080:8080 demo:0.0.1-SNAPSHOT

এই মুহুর্তে আমরা নেটিভ অ্যাপ্লিকেশন সমীকরণের উভয় দিক দেখতে একটি দুর্দান্ত অবস্থানে আছি।

আমরা কম্পাইলের সময় কিছুটা সময় এবং অতিরিক্ত মেমরি ব্যবহার ছেড়ে দিয়েছি, কিন্তু বিনিময়ে আমরা একটি অ্যাপ্লিকেশন পাই যা আরও দ্রুত শুরু করতে পারে এবং উল্লেখযোগ্যভাবে কম মেমরি ব্যবহার করতে পারে (ওয়ার্কলোডের উপর নির্ভর করে)।

যদি আমরা docker images demo চালাই তাহলে নেটিভ ইমেজের আকারের সাথে মূলের তুলনা করতে, আমরা একটি নাটকীয় হ্রাস দেখতে পাব:

e667f65a011c1328.png

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

6. আমাদের নেটিভ অ্যাপ স্থাপন করা হচ্ছে

ক্লাউড রানে আমাদের অ্যাপ স্থাপন করার জন্য, আর্টিফ্যাক্ট রেজিস্ট্রির মতো প্যাকেজ ম্যানেজারে আমাদের নেটিভ ইমেজ পেতে হবে।

1. আমাদের ডকার সংগ্রহস্থল প্রস্তুত করা হচ্ছে

আমরা একটি সংগ্রহস্থল তৈরি করে এই প্রক্রিয়াটি শুরু করতে পারি:

gcloud artifacts repositories create native-image-docker-repo --repository-format=docker \
--location=us-central1 --description="Repository for our native images"

এর পরে, আমরা নিশ্চিত করতে চাই যে আমরা আমাদের নতুন রেজিস্ট্রিতে পুশ করার জন্য প্রমাণীকরণ করেছি।

gcloud CLI সেই প্রক্রিয়াটিকে কিছুটা সরল করতে পারে:

gcloud auth configure-docker us-central1-docker.pkg.dev

2. আর্টিফ্যাক্ট রেজিস্ট্রিতে আমাদের ছবি পুশ করা

পরবর্তীতে আমরা আমাদের ছবিটি ট্যাগ করব:

export PROJECT_ID=$(gcloud config list --format 'value(core.project)')


docker tag  demo:0.0.1-SNAPSHOT \
us-central1-docker.pkg.dev/$PROJECT_ID/native-image-docker-repo/quickstart-image:tag2

এবং তারপরে আমরা এটি আর্টিফ্যাক্ট রেজিস্ট্রিতে পাঠাতে docker push ব্যবহার করতে পারি:

docker push us-central1-docker.pkg.dev/$PROJECT_ID/native-image-docker-repo/quickstart-image:tag2

3. ক্লাউড রানে স্থাপন করা হচ্ছে

আমরা এখন আর্টিফ্যাক্ট রেজিস্ট্রিতে সংরক্ষিত চিত্রটিকে ক্লাউড রানে স্থাপন করতে প্রস্তুত:

gcloud run deploy --image us-central1-docker.pkg.dev/$PROJECT_ID/native-image-docker-repo/quickstart-image:tag2

যেহেতু আমরা আমাদের অ্যাপটিকে একটি নেটিভ ইমেজ হিসাবে তৈরি এবং স্থাপন করেছি, তাই আমরা আশ্বস্ত হতে পারি যে আমাদের অ্যাপ্লিকেশনটি চলার সাথে সাথে আমাদের অবকাঠামোগত খরচের চমৎকার ব্যবহার করছে।

নির্দ্বিধায় আমাদের বেসলাইন অ্যাপের শুরুর সময়গুলি নিজের জন্য এই নতুন নেটিভের সাথে তুলনা করুন!

6dde63d35959b1bb.png

7. সারাংশ/পরিষ্কার

Google ক্লাউডে একটি স্প্রিং নেটিভ অ্যাপ্লিকেশন তৈরি এবং স্থাপন করার জন্য অভিনন্দন!

আশা করি এই টিউটোরিয়ালটি আপনাকে স্প্রিং নেটিভ প্রজেক্টের সাথে আরও পরিচিত হতে উৎসাহিত করবে এবং ভবিষ্যতে আপনার প্রয়োজন মেটাতে হলে এটি মনে রাখবেন।

ঐচ্ছিক: পরিষ্কার করুন এবং/অথবা পরিষেবা অক্ষম করুন

আপনি এই কোডল্যাবের জন্য একটি Google ক্লাউড প্রকল্প তৈরি করেছেন বা বিদ্যমান একটি পুনঃব্যবহার করছেন কিনা, আমরা যে সংস্থানগুলি ব্যবহার করেছি তা থেকে অপ্রয়োজনীয় চার্জ এড়াতে সতর্ক থাকুন৷

আপনি আমাদের তৈরি করা ক্লাউড রান পরিষেবাগুলি মুছতে বা অক্ষম করতে পারেন, আমাদের হোস্ট করা ছবি মুছে ফেলতে পারেন বা পুরো প্রকল্পটি বন্ধ করতে পারেন

8. অতিরিক্ত সম্পদ

যদিও স্প্রিং নেটিভ প্রজেক্টটি বর্তমানে একটি নতুন এবং পরীক্ষামূলক প্রজেক্ট, প্রাথমিকভাবে গ্রহণকারীদের সমস্যা সমাধানে এবং জড়িত হতে সাহায্য করার জন্য ইতিমধ্যেই প্রচুর ভালো সম্পদ রয়েছে:

অতিরিক্ত সম্পদ

নীচে অনলাইন সংস্থান রয়েছে যা এই টিউটোরিয়ালের জন্য প্রাসঙ্গিক হতে পারে:

লাইসেন্স

এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন 2.0 জেনেরিক লাইসেন্সের অধীনে লাইসেন্সপ্রাপ্ত।