একটি টোকেন বালতি প্রয়োগ করা মোটামুটি সহজ।
5 টোকেন দিয়ে বালতি দিয়ে শুরু করুন।
প্রতি 5/8 সেকেন্ড: বালতিতে যদি 5 টোকেনের চেয়ে কম থাকে তবে একটি যুক্ত করুন।
প্রতিবার আপনি বার্তা পাঠাতে চান: বালতিটিতে যদি ≥1 টোকেন থাকে তবে একটি টোকেন বের করে বার্তাটি প্রেরণ করুন। অন্যথায়, অপেক্ষা করুন / বার্তাটি / যাই হোক না কেন ফেলে দিন।
(স্পষ্টতই, আসল কোডে আপনি বাস্তব টোকেনের পরিবর্তে একটি পূর্ণসংখ্যার কাউন্টার ব্যবহার করতে পারেন এবং টাইমস্ট্যাম্পগুলি সংরক্ষণ করে আপনি প্রতি 5 / 8s পদক্ষেপটি অপ্টিমাইজ করতে পারেন)
আবার প্রশ্নটি পড়া, যদি হারের সীমাটি প্রতি 8 সেকেন্ডে পুরোপুরি পুনরায় সেট করা হয় তবে এখানে একটি পরিবর্তন আছে:
একটি টাইমস্ট্যাম্প দিয়ে শুরু করুন, last_send
অনেক আগে (যেমন, যুগের আগে)) এছাড়াও, একই 5-টোকেন বালতি দিয়ে শুরু করুন।
প্রতি 5/8 সেকেন্ডের নিয়মটি স্ট্রাইক করুন।
প্রতিবার আপনি বার্তা প্রেরণ করুন: প্রথমে, last_send
8 সেকেন্ড আগে পরীক্ষা করে দেখুন । যদি তা হয় তবে বালতিটি পূরণ করুন (এটি 5 টোকেনে সেট করুন)। দ্বিতীয়ত, যদি বালতিতে টোকেন থাকে তবে বার্তাটি প্রেরণ করুন (অন্যথায়, ড্রপ / ওয়েট / ইত্যাদি)। তৃতীয়, last_send
এখন সেট করুন।
এটি সেই দৃশ্যের জন্য কাজ করা উচিত।
আমি আসলে এই জাতীয় কৌশল ব্যবহার করে একটি আইআরসি বট লিখেছি (প্রথম পদ্ধতির)। এটি পার্লে রয়েছে, পাইথন নয়, তবে এখানে কিছু উদাহরণ দেওয়ার জন্য এখানে রয়েছে:
এখানে প্রথম অংশটি বালতিতে টোকেন যুক্ত করে পরিচালনা করে। আপনি সময়ের উপর ভিত্তি করে টোকেন যুক্ত করার অপ্টিমাইজেশন দেখতে পারেন (দ্বিতীয় থেকে শেষ লাইনের) এবং তারপরে সর্বশেষ লাইনে ক্ল্যাম্পস বালতি সামগ্রী সর্বাধিক (MESSAGE_BURST)
my $start_time = time;
...
# Bucket handling
my $bucket = $conn->{fujiko_limit_bucket};
my $lasttx = $conn->{fujiko_limit_lasttx};
$bucket += ($start_time-$lasttx)/MESSAGE_INTERVAL;
($bucket <= MESSAGE_BURST) or $bucket = MESSAGE_BURST;
$ সংযোগ একটি ডেটা স্ট্রাকচার যা চারপাশে পাস করা হয়। এটি এমন একটি পদ্ধতির অভ্যন্তরে যা নিয়মিত চলে (এটি পরের বারের মতো কিছু করার দরকার পরে তা গণনা করে এবং দীর্ঘক্ষণ অথবা এটি নেটওয়ার্ক ট্র্যাফিক না পাওয়া পর্যন্ত ঘুমায়)। পদ্ধতির পরবর্তী অংশ প্রেরণ পরিচালনা করে। এটি বরং জটিল, কারণ বার্তাগুলির সাথে তাদের সাথে অগ্রাধিকার যুক্ত থাকে।
# Queue handling. Start with the ultimate queue.
my $queues = $conn->{fujiko_queues};
foreach my $entry (@{$queues->[PRIORITY_ULTIMATE]}) {
# Ultimate is special. We run ultimate no matter what. Even if
# it sends the bucket negative.
--$bucket;
$entry->{code}(@{$entry->{args}});
}
$queues->[PRIORITY_ULTIMATE] = [];
এটি প্রথম সারি, যা চালানো যাই হোক না কেন। এমনকি যদি এটি আমাদের সংযোগ বন্যার জন্য মারা যায়। সার্ভারের পিংয়ের প্রতিক্রিয়া জানানোর মতো অত্যন্ত গুরুত্বপূর্ণ কাজের জন্য ব্যবহৃত হয়। পরবর্তী, বাকি সারিতে:
# Continue to the other queues, in order of priority.
QRUN: for (my $pri = PRIORITY_HIGH; $pri >= PRIORITY_JUNK; --$pri) {
my $queue = $queues->[$pri];
while (scalar(@$queue)) {
if ($bucket < 1) {
# continue later.
$need_more_time = 1;
last QRUN;
} else {
--$bucket;
my $entry = shift @$queue;
$entry->{code}(@{$entry->{args}});
}
}
}
অবশেষে, বালতির স্থিতি আবার $ কান ডেটা স্ট্রাকচারে সংরক্ষণ করা হয় (আসলে পদ্ধতিতে কিছুটা পরে; এটি আরও কাজ করে কত শীঘ্রই এটি প্রথমে গণনা করে)
# Save status.
$conn->{fujiko_limit_bucket} = $bucket;
$conn->{fujiko_limit_lasttx} = $start_time;
আপনি দেখতে পাচ্ছেন, আসল বালতি হ্যান্ডলিং কোডটি খুব ছোট - প্রায় চারটি লাইন। কোডের বাকি অংশটি হ'ল অগ্রাধিকারের সারি হ্যান্ডলিং। বটের অগ্রাধিকারের কাত রয়েছে যাতে উদাহরণস্বরূপ, কেউ এটির সাথে চ্যাট করে এটি এর গুরুত্বপূর্ণ কিক / নিষেধাজ্ঞার দায়িত্ব পালন থেকে আটকাতে পারে না।