Seperti yang saya katakan di atas, lebih banyak trafik memang satu perkara yang baik, tetapi jika ia terlebih muatan dan sistem hang, semua orang akan menderita.
IT tidak pergi lagi, sebelum pelbagai aktiviti promosi utama, adalah perlu untuk menguji sistem, menilai puncak QPs keseluruhan sistem, dan membuat beberapa tetapan mengehadkan semasa. , ia akan menolak untuk memproses atau Menangguhkan pemprosesan untuk mengelakkan sistem hang-up. Apakah perbezaan antara pengehadan semasa dan peleburan?
Penghadan trafik berlaku sebelum trafik masuk dan lebihan trafik dihadkan.
Pemutus litar ialah mekanisme untuk menangani kerosakan Ia berlaku selepas trafik masuk. Jika sistem gagal atau tidak normal, fius akan secara automatik memotong permintaan untuk mengelakkan kerosakan daripada terus berkembang dan menyebabkan runtuhan perkhidmatan.
Apakah perbezaan antara pengehadan semasa dan keratan puncak?
Pencukuran puncak ialah proses melicinkan lalu lintas, yang mengelakkan bebanan segera sistem dengan meningkatkan kadar pemprosesan permintaan secara perlahan.
Peak cutting mungkin takungan, yang menyimpan aliran dan mengalir perlahan-lahan Pengehad aliran mungkin pintu, yang menolak aliran berlebihan.
Proses umum pengehadan arus
Jadi bagaimana untuk melaksanakan pengehadan arus tertentu? Ia boleh diringkaskan kepada langkah-langkah berikut: Proses umum pengehadan semasa
Trafik permintaan statistik: Catatkan bilangan atau kadar permintaan, yang boleh dikira melalui kaunter, tingkap gelongsor, dsb.
Tentukan sama ada had melebihi: Berdasarkan syarat sekatan yang ditetapkan, tentukan sama ada trafik permintaan semasa melebihi had.
Laksanakan strategi pengehadan semasa: Jika trafik permintaan melebihi had, laksanakan strategi pengehadan semasa, seperti menolak permintaan, menangguhkan pemprosesan, mengembalikan maklumat ralat, dsb.
Kemas kini maklumat statistik: Kemas kini maklumat statistik berdasarkan hasil pemprosesan permintaan, seperti meningkatkan nilai kaunter, mengemas kini data tetingkap gelongsor, dsb.
Ulangi langkah di atas: Teruskan mengira trafik permintaan, tentukan sama ada had melebihi, laksanakan dasar pengehadan semasa dan kemas kini maklumat statistik
Perlu diambil perhatian bahawa pelaksanaan algoritma pengehadan semasa tertentu mungkin berbeza mengikut berbeza Laraskan dan optimumkan mengikut senario dan keperluan, seperti menggunakan algoritma baldi token, algoritma baldi bocor, dsb.
Penghadan arus mesin tunggal dan pengehadan arus teragih
Kami mendapati bahawa dalam proses umum pengehadan semasa, adalah perlu untuk mengira volum permintaan dan mengemas kini statistik, jadi statistik dan kemas kini volum permintaan mesti dikekalkan dalam simpanan.
Jika ia hanya persekitaran yang berdiri sendiri, ia adalah mudah untuk mengendalikan dan menyimpannya secara langsung secara tempatan.
Mesin tunggal vs kluster
Tetapi secara umum, perkhidmatan kami digunakan dalam kelompok Bagaimana untuk mencapai pengehadan arus keseluruhan di antara berbilang mesin?
Pada masa ini, kami boleh meletakkan maklumat statistik kami ke dalam storan K-V yang diedarkan seperti Tair atau Redis.
Empat algoritma pengehad semasa dan pelaksanaan diedarkan
Seterusnya, kami mula melaksanakan beberapa algoritma pengehad semasa biasa Di sini kami menggunakan Redis sebagai storan teragih Tidak perlu dikatakan, Redis ialah DB cache yang diedarkan paling popular. Redission hanya digunakan untuk kunci yang diedarkan, yang agak "tidak mahir". Malah, ia juga sangat mudah digunakan sebagai pelanggan Redis. .
Add Dependency
RREEEE
Se Mode Singleton Untuk mendapatkan redissonClient. prinsip
Algoritma tetingkap tetap juga dipanggil algoritma pembilang dalam banyak bahan rujukan Sudah tentu, saya secara peribadi memahami bahawa algoritma pembilang adalah kes khas algoritma tetingkap tetap, kami tidak begitu risau .
Algoritma tetingkap tetap ialah algoritma pengehadan semasa yang agak mudah Ia membahagikan masa kepada tetingkap masa tetap dan menetapkan had pada bilangan permintaan yang dibenarkan dalam setiap tetingkap. Jika bilangan permintaan melebihi had atas dalam tetingkap masa, had semasa akan dicetuskan.
Sisipkan penerangan gambar di sini
Pelaksanaan algoritmaPelaksanaan tetingkap tetap berdasarkan Redisson agak mudah. Dalam setiap tempoh tetingkap, kami boleh mengira bilangan permintaan melalui operasi . Setelah tempoh tetingkap tamat, kami boleh memanfaatkan ciri tamat tempoh utama Redis untuk menetapkan semula kiraan secara automatik. Mari kita lihat pelaksanaan kod:
incrementAndGetKunci teragih tambahan digunakan di sini untuk menyelesaikan masalah permulaan tetingkap dalam situasi serentak.
Jom uji lagi
public class RedissonConfig {
private static final String REDIS_ADDRESS = "redis://127.0.0.1:6379";
private static volatile RedissonClient redissonClient;
public static RedissonClient getInstance(){
if (redissonClient==null){
synchronized (RedissonConfig.class){
if (redissonClient==null){
Config config = new Config();
config.useSingleServer().setAddress(REDIS_ADDRESS);
redissonClient = Redisson.create(config);
return redissonClient;
}
}
}
return redissonClient;
}
}
Salin selepas log masuk
Sudah tentu, anda juga boleh menulis antara muka dan menggunakan alat ujian tekanan seperti Jmeter untuk menguji.
Kelebihan algoritma tetingkap tetap ialah ia mudah dilaksanakan dan mengambil sedikit ruang, tetapi ia mempunyai masalah kritikal Memandangkan penukaran tetingkap selesai serta-merta, pemprosesan permintaan tidak lancar, dan turun naik yang ganas dalam trafik mungkin berlaku. pada saat penukaran tetingkap.
Sebagai contoh, dalam contoh ini, jika sebilangan besar permintaan tiba-tiba masuk pada 00:02, tetapi kami menetapkan semula kiraan pada masa ini, maka kami tidak boleh mengehadkan trafik mengejut. . Prinsip algoritmaPrinsip algoritma pengehadan arus tetingkap gelongsor adalah untuk membahagikan tetingkap masa yang besar kepada beberapa tetingkap masa kecil, dan setiap tetingkap kecil mempunyai kiraan bebas.
Apabila permintaan masuk, tentukan sama ada bilangan permintaan melebihi had keseluruhan tetingkap. Tetingkap bergerak ke hadapan setiap kaliGelongsorTetingkap unit kecil. Sebagai contoh, tetingkap gelongsor di bawah membahagikan tetingkap masa besar 1 minit kepada 5 tetingkap kecil, dan masa setiap tetingkap kecil ialah 12 saat.
Setiap sel mempunyai pembilang bebasnya sendiri, yang akan bergerak ke hadapan satu sel setiap 12 saat.
Jika permintaan datang pada 00:01, kiraan tetingkap pada masa ini ialah 3+12+9+15=39, yang juga boleh memainkan peranan dalam pengehadan semasa.
Rajah skematik tetingkap gelongsor🜎 mengapa algoritma tetingkap gelongsor boleh menyelesaikan masalah Kritikal, lebih banyak grid gelongsor yang ada, lebih banyak gelongsor keseluruhan akan menjadi Lancar</ code>, kesan pengehadan semasa akan menjadi lebih tepat. <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"><code style="padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 100, 65);">滑动一个小的单元窗口。
Jadi bagaimana kita melaksanakan algoritma pengehadan semasa tetingkap gelongsor di sini? Ia sangat mudah, kita boleh terus menggunakan struktur set pesanan (zset) Redis.
Kami menggunakan cap masa sebagai markah dan ahli Apabila permintaan datang, cap masa semasa ditambah pada set yang dipesan. Kemudian untuk permintaan di luar tetingkap, kita boleh mengira cap waktu permulaan berdasarkan saiz tetingkap dan memadamkan permintaan di luar tetingkap. Dengan cara ini, saiz set yang dipesan ialah bilangan permintaan dalam tetingkap kami.
zset实现滑动窗口
代码实现
public class SlidingWindowRateLimiter {
public static final String KEY = "slidingWindowRateLimiter:";
/**
* 请求次数限制
*/
private Long limit;
/**
* 窗口大小(单位:S)
*/
private Long windowSize;
public SlidingWindowRateLimiter(Long limit, Long windowSize) {
this.limit = limit;
this.windowSize = windowSize;
}
public boolean triggerLimit(String path) {
RedissonClient redissonClient = RedissonConfig.getInstance();
//窗口计数
RScoredSortedSet<Long> counter = redissonClient.getScoredSortedSet(KEY + path);
//使用分布式锁,避免并发设置初始值的时候,导致窗口计数被覆盖
RLock rLock = redissonClient.getLock(KEY + "LOCK:" + path);
try {
rLock.lock(200, TimeUnit.MILLISECONDS);
// 当前时间戳
long currentTimestamp = System.currentTimeMillis();
// 窗口起始时间戳
long windowStartTimestamp = currentTimestamp - windowSize * 1000;
// 移除窗口外的时间戳,左闭右开
counter.removeRangeByScore(0, true, windowStartTimestamp, false);
// 将当前时间戳作为score,也作为member,
// TODO:高并发情况下可能没法保证唯一,可以加一个唯一标识
counter.add(currentTimestamp, currentTimestamp);
//使用zset的元素个数,作为请求计数
long count = counter.size();
// 判断时间戳数量是否超过限流阈值
if (count > limit) {
System.out.println("[triggerLimit] path:" + path + " count:" + count + " over limit:" + limit);
return true;
}
return false;
} finally {
rLock.unlock();
}
}
}
Atas ialah kandungan terperinci Empat algoritma pengehad semasa dan pelaksanaan kod yang diedarkan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.
Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.
Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach?
Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran.
Bacaan Lanjut: Penambahbaikan API Java Stream
Memahami aliran aliran
Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah