
မည်သည့်ဘာသာစကားဖြင့်မဆို high-load ပရောဂျက်များကို ဖော်ဆောင်ရာတွင် အထူးချဉ်းကပ်မှုနှင့် အထူးကိရိယာများအသုံးပြုမှု လိုအပ်သော်လည်း PHP တွင် အပလီကေးရှင်းများနှင့်ပတ်သက်လာသောအခါတွင်၊ ဥပမာအားဖြင့် သင်ဖွံ့ဖြိုးတိုးတက်ရန် လိုအပ်သည့်အခြေအနေမှာ ပိုမိုဆိုးရွားလာနိုင်သည်။ . ဤမှတ်စုတွင် ဖြန့်ဝေထားသော session storage နှင့် memcached တွင် data caching နှင့် “ward” ပရောဂျက်တစ်ခုတွင် ဤပြဿနာများကို ကျွန်ုပ်တို့ဖြေရှင်းပုံအကြောင်း ဆွေးနွေးပါမည်။
အခါသမယ၏သူရဲကောင်းသည် symfony 2.3 framework ကိုအခြေခံထားသော PHP အပလီကေးရှင်းတစ်ခုဖြစ်ပြီး၊ အပ်ဒိတ်လုပ်မည့်လုပ်ငန်းအစီအစဉ်များတွင်လုံးဝမပါဝင်ပါ။ အတော်လေး စံသတ်မှတ်ထားသော သိုလှောင်မှုအပြင်၊ ဤပရောဂျက်ကို အပြည့်အဝ အသုံးပြုခဲ့သည်။ "အရာရာကို သိမ်းဆည်းခြင်း" မူဝါဒ memcached တွင်- ဒေတာဘေ့စ်နှင့် API ဆာဗာများသို့ တောင်းဆိုမှုများကို တုံ့ပြန်မှုများ၊ အမျိုးမျိုးသော အလံများ၊ ကုဒ်လုပ်ဆောင်မှုကို ထပ်တူပြုခြင်းအတွက် သော့ခတ်မှုများနှင့် အခြားအရာများ။ ထိုသို့သောအခြေအနေတွင်၊ memcached သည် အက်ပလီကေးရှင်း၏လည်ပတ်မှုအတွက် အသက်အန္တရာယ်ဖြစ်စေပါသည်။ ထို့အပြင်၊ ကက်ရှ်ဆုံးရှုံးမှုသည် ဆိုးရွားသောအကျိုးဆက်များကို ဖြစ်ပေါ်စေသည်- DBMS သည် ချုပ်ရိုးများကြားတွင် ပေါက်ကြားလာသည်၊ API ဝန်ဆောင်မှုများသည် တောင်းဆိုမှုများကို တားမြစ်ရန်စသည် အခြေအနေတည်ငြိမ်စေရန် မိနစ်ဆယ်နှင့်ချီကြာနိုင်ပြီး ဤကာလအတွင်း ဝန်ဆောင်မှုသည် အလွန်နှေးကွေးနေမည် သို့မဟုတ် လုံးဝမရနိုင်ပါ။
ပံ့ပိုးပေးရန် လိုအပ်ပါသည်။ အားစိုက်ထုတ်မှုအနည်းငယ်ဖြင့် အပလီကေးရှင်းကို ရေပြင်ညီအတိုင်း အတိုင်းအတာချနိုင်မှု, i.e. အရင်းအမြစ်ကုဒ်သို့ အနည်းငယ်သောပြောင်းလဲမှုနှင့် လုပ်ဆောင်နိုင်စွမ်း အပြည့်အစုံကို ထိန်းသိမ်းထားသည်။ ကက်ရှ်သည် ကျရှုံးမှုများကို ခံနိုင်ရည်ရှိစေရုံသာမက ၎င်းမှ ဒေတာဆုံးရှုံးမှုကို လျှော့ချရန်လည်း ကြိုးစားပါ။
Memcached ကိုယ်တိုင်က ဘာဖြစ်နေတာလဲ။
ယေဘုယျအားဖြင့်၊ PHP အတွက် memcached extension သည် ဖြန့်ဝေထားသော data နှင့် session storage ကို box မှ ပံ့ပိုးပေးသည်။ တစ်သမတ်တည်းသော့ကို ဟက်ခြင်းအတွက် ယန္တရားသည် သင့်အား ဆာဗာများစွာတွင် ဒေတာများကို အညီအမျှ ထားရှိနိုင်စေကာ၊ အုပ်စုမှ သီးခြားဆာဗာတစ်ခုထံသို့ သီးခြားသော့တစ်ခုစီကို သီးခြားစီလိပ်စာပေးကာ တပ်ဆင်ထားသော ပျက်ကွက်မှုကိရိယာများသည် ကက်ရှ်ဝန်ဆောင်မှုကို မြင့်မားစွာရရှိနိုင်ကြောင်း သေချာစေသည် (သို့သော် ကံမကောင်းသည်မှာ၊ ဒေတာမရှိပါ။).
စက်ရှင်သိုလှောင်မှုနှင့်အတူ အရာများသည် အနည်းငယ်ပိုကောင်းသည်- သင် configure လုပ်နိုင်ပါသည်။ memcached.sess_number_of_replicasဒေတာများကို ဆာဗာများစွာတွင် တစ်ပြိုင်နက် သိမ်းဆည်းမည်ဖြစ်ပြီး၊ memcached ဥပမာတစ်ခု၏ ချို့ယွင်းချက်တစ်ခုကြောင့် ဒေတာကို အခြားသူများထံမှ လွှဲပြောင်းပေးမည်ဖြစ်သည်။ သို့သော်၊ ဆာဗာသည် ဒေတာမပါဘဲ အွန်လိုင်းမှ ပြန်တက်လာပါက (ပုံမှန်အတိုင်း ပြန်လည်စတင်ပြီးနောက်တွင်) အချို့သော့များကို ၎င်း၏သဘောအရ ပြန်လည်ဖြန့်ဝေမည်ဖြစ်သည်။ တကယ်တော့ ဒါက ဆိုလိုတာပါ။ session data ဆုံးရှုံးမှုလွဲချော်ပါက အခြားပုံစံတူသို့ "သွား" ရန် နည်းလမ်းမရှိသောကြောင့်ဖြစ်သည်။
စံချိန်မီ စာကြည့်တိုက်ကိရိယာများကို အဓိကအားဖြင့် ရည်ရွယ်ပါသည်။ အလျားလိုက် စကေးချဲ့ခြင်း- ၎င်းတို့သည် သင့်အား ကက်ရှ်အား အလွန်ကြီးမားသော အရွယ်အစားများအထိ တိုးမြှင့်နိုင်ပြီး မတူညီသော ဆာဗာများပေါ်တွင် လက်ခံထားသည့် ကုဒ်များမှ ဝင်ရောက်ခွင့်ကို ပေးစွမ်းနိုင်မည်ဖြစ်သည်။ သို့သော်၊ ကျွန်ုပ်တို့၏အခြေအနေတွင်၊ သိမ်းဆည်းထားသောဒေတာပမာဏသည် များစွာဂစ်ဂါဘိုက်ထက်မကျော်လွန်ပါ၊ နှင့်တစ်ခု သို့မဟုတ် နှစ်ခု node များ၏စွမ်းဆောင်ရည်သည် လုံလောက်ပါသည်။ ထို့ကြောင့်၊ အလုပ်လုပ်သည့်အခြေအနေတွင် အနည်းဆုံး cache instance တစ်ခုကို ထိန်းသိမ်းထားစဉ်တွင် တစ်ခုတည်းသော အသုံးဝင်သော စံကိရိယာများသည် memcached ရရှိနိုင်မှုကို သေချာစေရန် ဖြစ်နိုင်သည်။ သို့သော်လည်း ဤအခွင့်အရေးကိုပင် အခွင့်ကောင်းယူရန် မဖြစ်နိုင်ခဲ့ပေ... ဤတွင် ပရောဂျက်တွင် အသုံးပြုခဲ့သော မူဘောင်၏ ရှေးယခင်ကကို ပြန်လည်အမှတ်ရရကျိုးနပ်သည်၊ ထို့ကြောင့် ၎င်းအက်ပလီကေးရှင်းကို ဆာဗာပေါင်းကန်ဖြင့် လုပ်ဆောင်ရန် မဖြစ်နိုင်သောကြောင့် ဖြစ်သည်။ စက်ရှင်ဒေတာ ဆုံးရှုံးမှုကိုလည်း မမေ့ပါနှင့်- သုံးစွဲသူများ၏ ကြီးမားသော အကောင့်မှ ထွက်ခြင်းမှ ဖောက်သည်၏ မျက်လုံးများ လှုပ်ယမ်းသွားပါသည်။
အကောင်းဆုံးကတော့ လိုအပ်တယ်။ memcached နှင့် ပုံစံတူများကို ကျော်ဖြတ်ခြင်းတွင် မှတ်တမ်းများ၏ အတုယူမှု အမှားတစ်ခု သို့မဟုတ် အမှားတစ်ခုအတွက်။ ဤဗျူဟာကို အကောင်အထည်ဖော်ရန် ကျွန်ုပ်တို့ကို ကူညီပေးခဲ့သည်။ .
mcroouter
၎င်းသည် ၎င်း၏ပြဿနာများကို ဖြေရှင်းရန် Facebook မှ ဖန်တီးထားသော memcached router ဖြစ်သည်။ ၎င်းသည် ခွင့်ပြုသော memcached စာသားပရိုတိုကောကို ပံ့ပိုးပေးသည်။ အတိုင်းအတာ memcached ထည့်သွင်းမှုများ ရူးသွပ်သောအချိုးအစားသို့။ mcroouter ၏အသေးစိတ်ဖော်ပြချက်ကို တွင်တွေ့နိုင်သည်။ . ပမာ ၎င်းသည် ကျွန်ုပ်တို့ လိုအပ်သည်များကို လုပ်ဆောင်နိုင်သည်-
- မှတ်တမ်းပုံတူပွား;
- အမှားအယွင်းတစ်ခုဖြစ်ပေါ်ပါက အဖွဲ့အတွင်းရှိ အခြားဆာဗာများသို့ ပြန်လည်ပေးပို့ပါ။
အလုပ်သွားပါ။
mcroouter ဖွဲ့စည်းမှု
ငါ config ကို တိုက်ရိုက်သွားလိုက်မယ်
{
"pools": {
"pool00": {
"servers": [
"mc-0.mc:11211",
"mc-1.mc:11211",
"mc-2.mc:11211"
},
"pool01": {
"servers": [
"mc-1.mc:11211",
"mc-2.mc:11211",
"mc-0.mc:11211"
},
"pool02": {
"servers": [
"mc-2.mc:11211",
"mc-0.mc:11211",
"mc-1.mc:11211"
},
"route": {
"type": "OperationSelectorRoute",
"default_policy": "AllMajorityRoute|Pool|pool00",
"operation_policies": {
"get": {
"type": "RandomRoute",
"children": [
"MissFailoverRoute|Pool|pool02",
"MissFailoverRoute|Pool|pool00",
"MissFailoverRoute|Pool|pool01"
]
}
}
}
}ရေကန်သုံးကန် ဘာကြောင့်လဲ။ ဆာဗာများ အဘယ်ကြောင့် ထပ်ခါထပ်ခါ ဖြစ်နေသနည်း။ ဘယ်လိုအလုပ်လုပ်တယ်ဆိုတာ အဖြေရှာကြည့်ရအောင်။
- ဤဖွဲ့စည်းပုံတွင်၊ mcrouter သည် တောင်းဆိုချက်အမိန့်ကို အခြေခံ၍ တောင်းဆိုချက်ပေးပို့မည့်လမ်းကြောင်းကို ရွေးချယ်သည်။ ကောင်လေးက သူ့ကို ဒီလိုပြောပြတယ်။
OperationSelectorRoute. - တောင်းဆိုချက်များကို ကိုင်တွယ်သူထံသွားပါ။
RandomRoute၎င်းသည် array အရာဝတ္ထုများအကြား ရေကူးကန် သို့မဟုတ် လမ်းကြောင်းကို ကျပန်းရွေးချယ်သည်။children. ဤ array ၏ ဒြပ်စင်တစ်ခုစီသည် ကိုင်တွယ်သူအဖြစ် ပြောင်းလဲပါသည်။MissFailoverRouteဒေတာဖြင့် တုံ့ပြန်မှုမရရှိမချင်း၊ ၎င်းသည် ကလိုင်းယင့်ထံ ပြန်ပေးမည့် အစုအဝေးရှိ ဆာဗာတစ်ခုစီကို ဖြတ်သန်းသွားမည်ဖြစ်သည်။ - သီးသန့်သုံးရင်
MissFailoverRouteဆာဗာ သုံးခုပေါင်းစုကာ၊ ထို့နောက် တောင်းဆိုချက်များအားလုံးသည် ပထမ memcached စံနမူနာသို့ ဦးစွာရောက်ရှိလာမည်ဖြစ်ပြီး ကျန်အရာများမှာ ဒေတာမရှိသည့်အခါ ကျန်ရှိသော အခြေခံတောင်းဆိုမှုများကို လက်ခံရရှိမည်ဖြစ်သည်။ ထိုသို့သော ချဉ်းကပ်မှုမျိုး ဖြစ်ပေါ်လာမည်ဖြစ်သည်။ စာရင်းထဲရှိ ပထမဆုံး ဆာဗာပေါ်တွင် အလွန်အကျွံ ဝန်တင်ခြင်း။ထို့ကြောင့် မတူညီသော sequences များပါရှိသော ပေါင်းကူးကန်သုံးခုကို ထုတ်လုပ်ပြီး ၎င်းတို့ကို ကျပန်းရွေးချယ်ရန် ဆုံးဖြတ်ခဲ့သည်။ - အခြားတောင်းဆိုမှုများအားလုံးကို (၎င်းသည် မှတ်တမ်းတစ်ခုဖြစ်သည်) ကိုအသုံးပြု၍ လုပ်ဆောင်နေပါသည်။
AllMajorityRoute. ဤကိုင်တွယ်သူသည် ရေကူးကန်အတွင်းရှိ ဆာဗာများအားလုံးသို့ တောင်းဆိုမှုများကို ပေးပို့ပြီး ၎င်းတို့ထဲမှ အနည်းဆုံး N/2+1 ထံမှ တုံ့ပြန်မှုများကို စောင့်ဆိုင်းနေပါသည်။ အသုံးပြုခြင်းမှAllSyncRouteဤနည်းလမ်းသည် အပြုသဘောဆောင်သော တုံ့ပြန်မှုလိုအပ်သောကြောင့် စာရေးခြင်းလုပ်ငန်းများကို စွန့်လွှတ်ခဲ့ရသည်။ всех အုပ်စုအတွင်းရှိဆာဗာများ - မဟုတ်ပါက၎င်းသည်ပြန်လာလိမ့်မည်။SERVER_ERROR. mcrouter သည် ရရှိနိုင်သော ကက်ရှ်များသို့ ဒေတာကို ပေါင်းထည့်သော်လည်း၊ PHP လုပ်ဆောင်ချက်ကို ခေါ်ဆိုသည်။ error တစ်ခုပြန်ပေါ်လာလိမ့်မည်။ နှင့်သတိပေးချက်ထုတ်ပြန်လိမ့်မည်။AllMajorityRouteတင်းကျပ်လွန်းပြီး အထက်တွင်ဖော်ပြထားသော ပြဿနာများမရှိဘဲ ယူနစ်တစ်ဝက်အထိ ဝန်ဆောင်မှုမှ ဖယ်ရှားနိုင်မည်ဖြစ်သည်။
အဓိကပေါ့လေ။ ဤအစီအစဥ်သည် ကက်ရှ်တွင် အမှန်တကယ် ဒေတာမရှိပါက၊ ထို့နောက် သုံးစွဲသူ N မှ တောင်းဆိုချက်တိုင်းအတွက် memcached သို့ အမှန်တကယ် လုပ်ဆောင်လိမ့်မည်- အားလုံး ရေကူးကန်ရှိဆာဗာများ။ ဥပမာအားဖြင့်၊ ရေကူးကန်များရှိ ဆာဗာအရေအတွက်ကို နှစ်ခုသို့ လျှော့ချနိုင်သည်- သိုလှောင်မှုယုံကြည်စိတ်ချရမှုကို စွန့်ပယ်ခြင်း၊оမြန်နှုန်းမြင့်ပြီး တောင်းဆိုချက်များမှ ပျောက်ဆုံးနေသောသော့များအထိ ဝန်နည်းသည်။
NB: mcroouter သင်ယူခြင်းအတွက် အသုံးဝင်သောလင့်ခ်များကိုလည်း သင်ရှာဖွေနိုင်ပါသည်။ и (အပိတ်များ အပါအဝင်) အမျိုးမျိုးသောဖွဲ့စည်းပုံများ၏ သိုလှောင်ရုံတစ်ခုလုံးကို ကိုယ်စားပြုသည်။
mcroouter တည်ဆောက်ခြင်းနှင့်လည်ပတ်ခြင်း။
ကျွန်ုပ်တို့၏အပလီကေးရှင်း (နှင့် memcached ကိုယ်တိုင်) Kubernetes တွင်အလုပ်လုပ်သည် - ထို့ကြောင့်၊ mcrouter သည်လည်းထိုနေရာတွင်တည်ရှိသည်။ ဘို့ ကွန်တိန်နာတပ်ဆင်ခြင်း။ ငါတို့သုံးတယ်။ ၊ config သည်ဤကဲ့သို့ဖြစ်လိမ့်မည်-
NB: ဆောင်းပါးတွင် ပေးထားသည့် စာရင်းများကို သိုလှောင်ခန်းတွင် ထုတ်ဝေထားသည်။ .
configVersion: 1
project: mcrouter
deploy:
namespace: '[[ env ]]'
helmRelease: '[[ project ]]-[[ env ]]'
---
image: mcrouter
from: ubuntu:16.04
mount:
- from: tmp_dir
to: /var/lib/apt/lists
- from: build_dir
to: /var/cache/apt
ansible:
beforeInstall:
- name: Install prerequisites
apt:
name: [ 'apt-transport-https', 'tzdata', 'locales' ]
update_cache: yes
- name: Add mcrouter APT key
apt_key:
url: https://facebook.github.io/mcrouter/debrepo/xenial/PUBLIC.KEY
- name: Add mcrouter Repo
apt_repository:
repo: deb https://facebook.github.io/mcrouter/debrepo/xenial xenial contrib
filename: mcrouter
update_cache: yes
- name: Set timezone
timezone:
name: "Europe/Moscow"
- name: Ensure a locale exists
locale_gen:
name: en_US.UTF-8
state: present
install:
- name: Install mcrouter
apt:
name: [ 'mcrouter' ]()
... ပုံကြမ်းထုတ်ပါ။ ပဲ့စင်ဇယား. စိတ်ဝင်စားစရာကောင်းတာက ပုံတူအရေအတွက်ပေါ်မူတည်ပြီး config generator တစ်ခုပဲရှိပါတယ်။ (မည်သူမဆို ပို၍ ပေါ့ပါးပြီး အံဝင်ခွင်ကျရှိသော ရွေးချယ်မှုရှိပါက comment တွင် မျှဝေပါ):
{{- $count := (pluck .Values.global.env .Values.memcached.replicas | first | default .Values.memcached.replicas._default | int) -}}
{{- $pools := dict -}}
{{- $servers := list -}}
{{- /* Заполняем массив двумя копиями серверов: "0 1 2 0 1 2" */ -}}
{{- range until 2 -}}
{{- range $i, $_ := until $count -}}
{{- $servers = append $servers (printf "mc-%d.mc:11211" $i) -}}
{{- end -}}
{{- end -}}
{{- /* Смещаясь по массиву, получаем N срезов: "[0 1 2] [1 2 0] [2 0 1]" */ -}}
{{- range $i, $_ := until $count -}}
{{- $pool := dict "servers" (slice $servers $i (add $i $count)) -}}
{{- $_ := set $pools (printf "MissFailoverRoute|Pool|pool%02d" $i) $pool -}}
{{- end -}}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: mcrouter
data:
config.json: |
{
"pools": {{- $pools | toJson | replace "MissFailoverRoute|Pool|" "" -}},
"route": {
"type": "OperationSelectorRoute",
"default_policy": "AllMajorityRoute|Pool|pool00",
"operation_policies": {
"get": {
"type": "RandomRoute",
"children": {{- keys $pools | toJson }}
}
}
}
}()
ကျွန်ုပ်တို့သည် ၎င်းကို စမ်းသပ်ပတ်ဝန်းကျင်တွင် ဖြန့်ကျက်ပြီး စစ်ဆေးပါ-
# php -a
Interactive mode enabled
php > # Проверяем запись и чтение
php > $m = new Memcached();
php > $m->addServer('mcrouter', 11211);
php > var_dump($m->set('test', 'value'));
bool(true)
php > var_dump($m->get('test'));
string(5) "value"
php > # Работает! Тестируем работу сессий:
php > ini_set('session.save_handler', 'memcached');
php > ini_set('session.save_path', 'mcrouter:11211');
php > var_dump(session_start());
PHP Warning: Uncaught Error: Failed to create session ID: memcached (path: mcrouter:11211) in php shell code:1
Stack trace:
#0 php shell code(1): session_start()
#1 {main}
thrown in php shell code on line 1
php > # Не заводится… Попробуем задать session_id:
php > session_id("zzz");
php > var_dump(session_start());
PHP Warning: session_start(): Cannot send session cookie - headers already sent by (output started at php shell code:1) in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Failed to write session lock: UNKNOWN READ FAILURE in php shell code on line 1
PHP Warning: session_start(): Unable to clear session lock record in php shell code on line 1
PHP Warning: session_start(): Failed to read session data: memcached (path: mcrouter:11211) in php shell code on line 1
bool(false)
php >အမှား၏စာသားကိုရှာဖွေခြင်းသည် မည်သည့်ရလဒ်မျှမပေးခဲ့ဘဲ၊ မေးမြန်းမှုအတွက် ““ရှေ့ဆုံးမှာ ပရောဂျက်ရဲ့ ရှေးအကျဆုံး မဖြေရှင်းနိုင်တဲ့ ပြဿနာက၊ memcached binary ပရိုတိုကော။
NB− memcached ရှိ ASCII ပရိုတိုကောသည် binary တစ်ခုထက် နှေးကွေးပြီး တစ်သမတ်တည်းသော့ကို ဟက်ခြင်း၏ စံနည်းလမ်းများသည် binary ပရိုတိုကောနှင့်သာ အလုပ်လုပ်ပါသည်။ ဒါပေမယ့် ဒါက သီးခြားကိစ္စတစ်ခုအတွက် ပြဿနာမဖြစ်စေပါဘူး။
လှည့်ကွက်က အိတ်ထဲမှာ ရှိပါတယ်- သင်လုပ်ရမှာက ASCII protocol ကိုပြောင်းပြီး အရာအားလုံး အဆင်ပြေသွားမှာပါ...။ သို့သော် ဤကိစ္စတွင် အဖြေရှာဖွေသည့် အလေ့အထရှိသည်။ ရက်စက်တဲ့ဟာသကို ကစားခဲ့တယ်။ အဲဒီမှာ အဖြေမှန်ကို သင်ရှာတွေ့မှာ မဟုတ်ပါဘူး...၊ သေချာပါတယ်၊ သင်က အပိုင်းရဲ့ အဆုံးကို ရွှေ့မပေးမချင်း "အသုံးပြုသူမှ ပံ့ပိုးထားသော မှတ်စုများ" သစ္စာရှိလိမ့်မည်။ .
ဟုတ်ကဲ့၊ မှန်ကန်သော ရွေးချယ်မှုအမည်မှာ ဖြစ်ပါသည်။ memcached.sess_binary_protocol. ၎င်းကို ပိတ်ထားရမည်၊ ထို့နောက် ဆက်ရှင်များ စတင်အလုပ်လုပ်ပါမည်။ ကျန်တာအားလုံးက PHP နဲ့ pod ထဲကို mcouter ပါတဲ့ container ကိုထည့်ဖို့ပါပဲ။
ကောက်ချက်
ထို့ကြောင့်၊ အခြေခံအဆောက်အအုံဆိုင်ရာပြောင်းလဲမှုများဖြင့် ကျွန်ုပ်တို့သည် ပြဿနာကိုဖြေရှင်းနိုင်ခဲ့သည်- memcached အမှားခံနိုင်ရည်ရှိမှုပြဿနာကို ဖြေရှင်းပြီးဖြစ်ပြီး cache သိုလှောင်မှု၏ယုံကြည်စိတ်ချရမှုကို တိုးမြင့်လာစေသည်။ အက်ပလီကေးရှင်းအတွက် သိသာထင်ရှားသော အားသာချက်များအပြင်၊ ၎င်းသည် ပလပ်ဖောင်းပေါ်တွင် အလုပ်လုပ်သည့်အခါ လေ့ကျင့်ရန်နေရာပေးသည်- အစိတ်အပိုင်းအားလုံးတွင် အရန်ထားရှိသောအခါ စီမံခန့်ခွဲသူ၏ဘဝသည် အလွန်ရိုးရှင်းပါသည်။ ဟုတ်ကဲ့၊ ဒီနည်းလမ်းမှာလည်း အားနည်းချက်တွေရှိပါတယ်၊ ၎င်းသည် "Crutch" ကဲ့သို့ဖြစ်နိုင်သော်လည်း၊ ၎င်းသည် ငွေကုန်သက်သာပါက ပြဿနာကို မြှုပ်နှံပြီး အသစ်များကို မဖြစ်ပေါ်စေပါ - အဘယ်ကြောင့်နည်း။
PS
ကျွန်ုပ်တို့၏ဘလော့ဂ်တွင်လည်းဖတ်ပါ
- "dapp နဲ့ လေ့ကျင့်ပါ" (ဥပမာအဖြစ် symfony-demo ကိုသုံး၍): и ;
- «"။
source: www.habr.com
