Rumah >masalah biasa >Bagaimana untuk memastikan mati pucuk antara muka di bawah konkurensi tinggi
Terdapat banyak operasi dalam sistem sebenar kami, yang sepatutnya menghasilkan kesan yang sama atau mengembalikan hasil yang sama tidak kira berapa kali ia dilakukan.
Contohnya:
Jika bahagian hadapan berulang kali menyerahkan data yang dipilih, latar belakang seharusnya hanya menjana satu hasil respons yang sepadan dengan data ini.
Apabila kami memulakan permintaan pembayaran, akaun pengguna hendaklah ditolak hanya sekali apabila menghadapi penghantaran semula rangkaian atau pepijat sistem, wang itu hendaklah ditolak sekali sahaja; sekali , mesej teks yang sama dihantar kepada pengguna, dan pengguna akan menangis;
dan banyak lagi situasi penting, logik ini memerlukan ciri idempoten untuk menyokong.
Idempoten (idempoten, idempotensi) ialah konsep matematik dan sains komputer yang biasa ditemui dalam algebra abstrak.
Fungsi ini tidak akan menjejaskan keadaan sistem, dan tidak perlu risau tentang perubahan pada sistem yang disebabkan oleh pelaksanaan berulang. Contohnya, fungsi "getUsername() dan setTrue()" ialah fungsi idempoten.
Operasi yang lebih kompleks dijamin menjadi idempoten dengan menggunakan nombor transaksi yang unik (nombor siri
Pemahaman saya: Idempotensi adalah operasi Tidak kira berapa kali ia dilaksanakan, kesan dan hasil yang dikembalikan adalah sama
1 Operasi pertanyaan Jika anda bertanya sekali atau bertanya beberapa kali, hasil pertanyaan akan sama apabila data kekal tidak berubah. Pilih ialah operasi idempoten semula jadi
2 Operasi Padam Operasi pemadaman juga adalah idempoten dan pemadaman berbilang kali akan memadamkan data. (Perhatikan bahawa hasil yang dikembalikan mungkin berbeza. Data yang dipadam tidak wujud, jadi 0 dikembalikan. Jika terdapat berbilang data yang dipadam, akan ada beberapa hasil yang dikembalikan)
3 contoh: Akaun modal Alipay, Alipay Terdapat juga akaun pengguna Setiap pengguna hanya boleh mempunyai satu akaun dana. jadi pengguna boleh berjaya menambah rekod akaun dana
Perkara utama: Indeks unik atau indeks gabungan unik untuk mengelakkan data kotor dalam data baharu (apabila jadual mempunyai indeks unik dan ralat dilaporkan apabila menambah data baharu semasa konkurensi, hanya bertanya semula. Data sepatutnya sudah wujud, hanya kembalikan hasilnya)
4
Keperluan perniagaan:
Data pada halaman hanya boleh diklik dan diserahkan sekali
Punca kejadian: Disebabkan klik berulang, penghantaran semula rangkaian, atau penghantaran semula nginx, dsb., data akan dihantar berulang kali
Penyelesaian: Kluster persekitaran: Gunakan token Tambah redis (redis adalah satu-benang, pemprosesan perlu beratur) Persekitaran JVM tunggal: gunakan token tambah redis atau token tambah memori jvm
Proses pemprosesan:
Sebelum menyerahkan data, anda mesti memohon token daripada perkhidmatan, dan token diletakkan dalam redis atau jvm Memory, masa sah token
Selepas penyerahan, latar belakang mengesahkan token, memadamkan token pada masa yang sama dan menjana token baharu untuk dikembalikan
Ciri token:
Untuk memohon, ia sah sekali, dan semasa boleh dihadkan
Nota: redis memerlukan Gunakan operasi pemadaman untuk menilai token yang berjaya bermakna pengesahan token telah lulus jika anda menggunakan pilih+ padam untuk mengesahkan token, akan ada masalah konkurensi. Ia tidak disyorkan untuk menggunakannya
5. Kunci pemerolehan apabila mendapatkan data
pilih * daripada table_xxx di mana id='xxx' untuk kemas kini;
Nota: Medan id mestilah kunci utama atau satu-satunya indeks, jika tidak, jadual akan dikunci, yang akan membunuh orang
Kunci pesimis biasanya digunakan bersama dengan transaksi, dan masa kunci data Mungkin sangat lama, sila pilih mengikut situasi sebenar
6 Kunci optimistik Kunci optimistik hanya mengunci jadual pada masa data dikemas kini, dan tidak mengunci jadual. pada masa lain, jadi ia lebih cekap daripada mengunci pesimis.
Penguncian optimis boleh dilaksanakan dalam pelbagai cara melalui versi atau syarat status yang lain:
1 Dilaksanakan melalui nombor versi
update table_xxx set name=#name#,version=version+1 where version=#version#
Seperti yang ditunjukkan di bawah (dari Internet):
2 melalui sekatan bersyarat Keperluan :kualiti-#subQuality# >= , senario ini sesuai untuk tiada nombor versi, hanya kemas kini untuk pengesahan keselamatan data, sesuai untuk model inventori, potongan bahagian dan bahagian rollback, prestasi yang lebih tinggi
注意:乐观锁的更新操作,最好用主键或者唯一索引来更新,这样是行锁,否则更新时会锁表,上面两个sql改成下面的两个更好
update tablexxx set name=#name#,version=version+1 where id=#id# and version=#version#update tablexxx set avaiamount=avaiamount-#subAmount# where id=#id# and avai_amount-#subAmount# >= 0
7. 分布式锁 还是拿插入数据的例子,如果是分布是系统,构建全局唯一索引比较困难,例如唯一性的字段没法确定
这时候可以引入分布式锁,通过第三方的系统(redis或zookeeper),在业务系统插入数据或者更新数据,获取分布式锁,然后做操作,之后释放锁
这样其实是把多线程并发的锁的思路,引入多多个系统,也就是分布式系统中得解决思路。
要点:某个长流程处理过程要求不能并发执行,可以在流程执行之前根据某个标志(用户ID+后缀等)获取分布式锁,其他流程执行时获取锁就会失败,也就是同一时间该流程只能有一个能执行成功,执行完成后,释放分布式锁(分布式锁要第三方系统提供)
8. select + insert 并发不高的后台系统,或者一些任务JOB,为了支持幂等,支持重复执行,简单的处理方法是,先查询下一些关键数据,判断是否已经执行过,在进行业务处理,就可以了
注意:核心高并发流程不要用这种方法
9. 状态机幂等 在设计单据相关的业务,或者是任务相关的业务,肯定会涉及到状态机(状态变更图),就是业务单据上面有个状态,状态在不同的情况下会发生变更,一般情况下存在有限状态机
Jika mesin keadaan sudah berada dalam keadaan seterusnya, dan perubahan kepada keadaan sebelumnya berlaku pada masa ini, perubahan tidak boleh dibuat secara teori Dalam kes ini, hilang pucuk mesin keadaan terhingga adalah dijamin.
Nota: Pesanan dan perniagaan jenis dokumen lain mempunyai aliran keadaan yang panjang Anda mesti mempunyai pemahaman yang mendalam tentang mesin keadaan, yang akan membantu meningkatkan keupayaan reka bentuk sistem perniagaan anda
10 antara muka luaran
Sebagai contoh, antara muka pembayaran yang disediakan oleh UnionPay: apabila anda perlu mengakses pedagang untuk menyerahkan permintaan pembayaran, ia disertakan dengan: sumber sumber, nombor siri seq
sumber+seq membuat indeks unik dalam pangkalan data untuk mengelakkan berbilang pembayaran (apabila serentak, hanya satu permintaan boleh diproses )
Isi pentingUntuk menyediakan antara muka luaran untuk menyokong panggilan idempoten, antara muka mempunyai dua medan yang mesti dilalui, satu adalah sumber dan lain ialah nombor jujukan sumber seq. Kedua-dua medan ini digunakan sebagai indeks unik bersama dalam sistem pembekal
Dengan cara ini, apabila pihak ketiga memanggil, mula-mula semak dalam sistem sendiri untuk melihat sama ada ia telah diproses, dan hasil pemprosesan yang sepadan akan dikembalikan; jika ia belum diproses, pemprosesan yang sepadan akan dilakukan dan hasilnya akan dikembalikan.
Perhatikan bahawa untuk menjadi idempoten dan mesra, anda mesti terlebih dahulu menyemak sama ada perniagaan telah diproses Jika anda memasukkannya terus ke dalam sistem perniagaan tanpa bertanya, ralat akan dilaporkan, tetapi ia sebenarnya telah diproses.
Idempotensi harus menjadi gen pengaturcara yang berkelayakan Apabila mereka bentuk sistem, ia adalah pertimbangan utama, terutamanya dalam sistem seperti Alipay, bank, syarikat kewangan Internet, dan lain-lain yang semuanya melibatkan wang data juga mesti tepat, jadi masalah seperti potongan yang berlebihan dan lebihan bayaran tidak boleh berlaku. Ini akan menjadi sukar untuk ditangani dan pengalaman pengguna tidak akan baik.
Atas ialah kandungan terperinci Bagaimana untuk memastikan mati pucuk antara muka di bawah konkurensi tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!