এসকিউএস ম্যাক্সমনিবারঅফমেসেসেজ


11

জাভা ক্লায়েন্ট অ্যাপ্লিকেশন ব্যবহার করে আমি বার্তাগুলির জন্য একটি এসকিউএস সারিতে অনুসন্ধান করছি। পরীক্ষার জন্য কাতারে সেটআপ হিসাবে 12,000 বার্তা রয়েছে। আমি ওপসজেডিকে ব্যবহার করছি আউস-জাভা-এসডিকে সর্বশেষ (সফটওয়্যার.আমাজোন.ওয়াসডকে ২.১০.২২) পম.এক্সএমএল আরও নীচে দেখানো হয়েছে।

আমি যে বিষয়টি দেখছি তা হ'ল সর্বোচ্চ সংখ্যা (10) সেট করা সত্ত্বেও আমি কেবল 3 পাই I আমি বুঝতে পারি যে এটি বার্তাগুলির সংখ্যার সর্বাধিক গ্যারান্টি নয় তবে প্রত্যাবর্তিত বার্তাগুলির সংখ্যার কোনও হার নেই। এটি সর্বদা 3।

এডাব্লুএস ডকুমেন্টেশন: ম্যাক্সনম্বার অফফেস ম্যাসেজগুলি সর্বাধিক সংখ্যক প্রত্যাবর্তনের জন্য। অ্যামাজন এসকিউএস কখনই এই মানটির চেয়ে বেশি বার্তা দেয় না (তবে কম বার্তা ফিরে আসতে পারে)। বৈধ মান: 1 থেকে 10 ডিফল্ট: 1. প্রকার: পূর্ণসংখ্যার প্রয়োজনীয়: না

সংক্ষিপ্ত পোলিং ব্যবহার করে বার্তা গ্রহণ করা

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

সুতরাং আমরা দু'টি ক্লায়েন্টকে একই ফলাফল সহ পুরানো আড্ডার এসডিকে এবং নতুনতর দুটি ব্যবহার করে পরীক্ষা করেছি tested সর্বদা কেবল 3 টি বার্তা ফিরে আসে।

মজার বিষয় হল যদি বাহ্যিকভাবে অ্যাপ্লিকেশনটি চালানোর পরিবর্তে (আমার শক্তিশালী ডেস্কটপে) আপনি এডাব্লুএস ল্যাম্বডা হিসাবে চালনা করেন তবে আপনি 10 বার্তা পাবেন। এই ল্যাম্বডা পরীক্ষাটি সহকর্মীর দ্বারা জাভাস্ক্রিপ্ট ব্যবহার করে করা হয়েছিল।

সুতরাং প্রশ্নটি এখনও থেকে যায় যে আমরা কেন কেবল অনুরোধ অনুযায়ী 3 বার্তা পাই এবং আপাতদৃষ্টিতে ল্যাম্বডায় আপনি 10 টি পেতে পারেন।

প্রতি অনুরোধের জন্য ব্যয় দেওয়া হয়েছে তা হ'ল অ্যামাজন লাভের ভিত্তিতে ওয়েট এলোমেলো বিতরণ =))

এসকিউএস পরীক্ষার পদ্ধতি:

public void SQStart()
{
    AwsBasicCredentials awsCreds = AwsBasicCredentials.create("accessKeyID", "secretKeyID");
    AwsCredentialsProvider creds = StaticCredentialsProvider.create(awsCreds);
    SqsClient sqs = SqsClient.builder().credentialsProvider(creds).region(Region.EU_WEST_1).build();
    GetQueueUrlRequest getQueueRequest = GetQueueUrlRequest.builder()
            .queueName(QUEUE_NAME)
            .build();
    String queueUrl = sqs.getQueueUrl(getQueueRequest).queueUrl();

    for (int x =1; x < 100; x++) {
        ReceiveMessageRequest receiveMessageRequest = ReceiveMessageRequest.builder()
                .queueUrl(queueUrl)
                .maxNumberOfMessages(10)
                .build();


        List<Message> messages = sqs.receiveMessage(receiveMessageRequest).messages();
        if (messages.size() > 3 ) {
            System.out.println("YEY More than 3 Messages: "+ messages.size());
        }
    }
}

POM.XML:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>groupId</groupId>
    <artifactId>SQSTest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>2.10.62</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>

            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>sqs</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.9</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.4.10</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-s3</artifactId>
            <version>1.11.720</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.6.1</version>
        </dependency>
    </dependencies>
</project>

কেবল একটি চিন্তাভাবনা, তবে আপনি কি এইডাব্লুএস-এ কাতারের কনফিগারেশনটি পরীক্ষা করেছেন? হতে পারে এটি একটি সর্বোচ্চ নম্বরআমফেসেসেস সম্পত্তি সহ সেটআপ হয়েছিল যা আপনি জাভা ক্লায়েন্টে সেট করেছেন তার চেয়ে বেশি অগ্রাধিকার পেতে পারে? যেহেতু এটি জাভাস্ক্রিপ্ট ল্যাম্বডায় কাজ করে, এটি অদ্ভুত হবে তবে
এটির

উত্তর:


9

প্রতি অনুরোধের জন্য ব্যয় দেওয়া হয়েছে তা হ'ল অ্যামাজন লাভের ভিত্তিতে ওয়েট এলোমেলো বিতরণ =))

এটি স্পষ্ট যে এখানে আপনার লক্ষ্য ব্যয় হ্রাস করা, এটি এসকিউএস-তে কম অনুরোধ প্রেরণ করে, বা এসকিউএসকে সর্বাধিক পরিমাণে প্রাপ্ত বার্তাগুলি সরবরাহ করতে বাধ্য করা উচিত।

যেমন আপনি আপনার প্রশ্নে বলেছেন, স্যাকিউএসের সর্বাধিক পরিমাণে প্রাপ্ত বার্তাগুলি সরবরাহ করার কোনও বাধ্যবাধকতা নেই। তবে, এমন কিছু আছে যা আমি আপনাকে অবহিত করতে চাই, ধরে নিই যে আপনি এটি সম্পর্কে ইতিমধ্যে অবহিত নন।


দীর্ঘ পোলিং

বিকাশকারী গাইড আমাজনের সরল সারি পরিষেবা রাজ্যের:

একটি সারি থেকে বার্তা গ্রহণের প্রক্রিয়া নির্ভর করে আপনি স্বল্প বা দীর্ঘ ভোটদান ব্যবহার করছেন কিনা তার উপর। ডিফল্টরূপে, অ্যামাজন এসকিউএস সংক্ষিপ্ত পোলিং ব্যবহার করে এর সার্ভারগুলির কেবলমাত্র একটি সাবসেটের (ওজনযুক্ত এলোমেলো বিতরণের উপর ভিত্তি করে) অনুসন্ধান করে কোনও প্রতিক্রিয়াটির জন্য কোনও বার্তা উপলব্ধ কিনা তা নির্ধারণ করতে। আপনার ভোক্তাদের কাতারে পৌঁছানোর সাথে সাথে বার্তাগুলি গ্রহণের অনুমতি দেওয়ার সময় আপনি আপনার ব্যয় হ্রাস করার জন্য দীর্ঘ পোলিং ব্যবহার করতে পারেন ।

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

যদি আমরা একই ডকুমেন্টেশন পৃষ্ঠায় দীর্ঘ ভোটদানের সুবিধাগুলি পর্যালোচনা করি তবে এতে বলা হয়েছে:

দীর্ঘ ভোটদান নিম্নলিখিত সুবিধা দেয়:

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

  • — অ্যামাজন এসকিউএস সার্ভারের সাবসেটের চেয়ে সমস্ত-কোয়েরি করে মিথ্যা খালি প্রতিক্রিয়াগুলি দূর করুন।

দ্বিতীয় বুলেটটি এখানে খুব গুরুত্বপূর্ণ। যদিও আপনি খালি প্রতিক্রিয়া দেখছেন না, সেখানে সার্ভারগুলিতে আরও বার্তাগুলি সঞ্চিত থাকতে পারে যা অনুসন্ধান করা হচ্ছে না। আপনি যদি দীর্ঘ পোলিং সক্ষম করেন, আপনার আশা করা উচিত যে মোটে 3 টিরও বেশি সার্ভার রয়েছে অনুমান করে ফিরে আসা বার্তাগুলির পরিমাণ বাড়তে হবে।

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


ডিভিলকোড নীচে নিজের মন্তব্যে উল্লেখ করেছেন যে , তিনি একটি স্ট্যান্ডার্ড সারির পরিবর্তে একটি ফিফোর সারি ব্যবহার করে এবং এর উপর দীর্ঘ ভোটদান সক্রিয় করে তার সমস্যা সমাধান করতে সক্ষম হন।


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

@ ডেভিলকোড দীর্ঘ ভোটদান সক্ষম করে আমার শেষের দিকে আমি আপনার সমস্যাটি পুনরুত্পাদন করতে পারিনি। আপনার কিউ মানক সারি বা একটি ফিফোর সারি? আপনি এডাব্লুএস এর সাথে একটি সমর্থন টিকিটও খুলতে চাইতে পারেন তারা তাদের শেষ পরিবর্তন করতে পারে কিনা তা দেখতে।
জ্যাকব জি।

এটি একটি মানক সারি। আপনি কি স্থানীয়ভাবে আপনার কোড চালনা করেছেন এবং আমরা জাভা ব্যবহার করছিলাম?
ডেভিলকোড

@ ডেভিলকোড আমি একটি ফিফোর সারি ব্যবহার করে এটি পরীক্ষা করেছি। এবং হ্যাঁ, আমি আমার এসকিউএস কিউ থেকে বার্তা পেতে AWS জাভা এসডিকে ভি 2 ব্যবহার করছি। আমার কোড কোনও এডাব্লুএস ল্যাম্বদা ফাংশনের মধ্যে চলছে না।
জ্যাকব জি।

1
ঠিক আছে FIFO সারিটি পরীক্ষা করে এবং আমরা 10 টি বার্তা পাই যেখানে স্ট্যান্ডার্ড সারিতে আমরা কেবল তিনটি পাই। আমি এখনই উপসংহারে পৌঁছাতে পারি যে ডকুমেন্টেশনগুলি FIFO সারিটিকে বোঝায়, মানক সারি নয়।
ডিভিলকোড

0

আমি মনে করি এই একটি অনুরূপ question.As জ্যাকব দ্বারা ইশারা, দীর্ঘ পোলিং সমস্যাটি সমাধান বলে মনে হয়।


0

দীর্ঘ ভোটদান:

        ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl)
              .withWaitTimeSeconds(10)     // long poll: wait 10 seconds, max is 20 seconds
              .withMaxNumberOfMessages(10);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.