ഫോൺ ഉറങ്ങുമ്പോൾ ചാറ്റ് ജീവനോടെ നിർത്തുന്നു
Mythex-ന്റെ ഏജന്റ് ഒരു അഭ്യർത്ഥനയിൽ മിനിറ്റുകളോളം പ്രവർത്തിച്ചേക്കാം, നിങ്ങൾ ഒരുപക്ഷേ ഒരു ഫോണിൽ നിന്നായിരിക്കും അത് കാണുന്നത് — അത് പ്രവർത്തിക്കുമ്പോൾ ഫോൺ ലോക്ക് ചെയ്യുകയും ആപ്പുകൾ മാറ്റുകയും നെറ്റ്വർക്ക് മാറ്റുകയും ചെയ്യുന്നു. രണ്ട് ബഗുകൾ അത് തെറ്റാക്കി. ഒന്നിൽ, "പേജ് വീണ്ടും ദൃശ്യമാണ്" എന്ന ഓരോ സിഗ്നലും കണക്ഷൻ ചത്തുപോയതിന്റെ തെളിവായി ചാറ്റ് കണക്കാക്കി, "Connecting…" എന്നതിൽ നിൽക്കുന്നതുവരെ ലൂപ്പ് ചെയ്തു. മറ്റൊന്നിൽ, പുതിയ ചാറ്റിന്റെ ആദ്യ മറുപടി ഉറക്കത്തിൽ കടന്നുപോയ ഫോൺ ഉണർന്നപ്പോൾ അതിന്റെ ആദ്യ കുറച്ച് കഷണങ്ങൾ മാത്രം കണ്ടു, മാനുവലായി റീഫ്രഷ് ചെയ്യുന്നതുവരെ. രണ്ടും പരിഹരിച്ചു.
ചാറ്റ് ഒരു ഓടുന്ന ടേണിനെ എങ്ങനെ പിന്തുടരുന്നു
ഏജന്റ് പ്രവർത്തിക്കുമ്പോൾ, ചാറ്റ് ഞങ്ങളുടെ സെർവറുകളിൽ നിന്ന് ഒരു സ്ട്രീം തുറന്നുവെക്കുന്നു: ഓരോ ഘട്ടവും — ഒരു ചിന്ത, ഒരു ടൂൾ കോൾ, മറുപടിയുടെ ഒരു കഷണം — ഒരു ഇവന്റായി എത്തുന്നു. സ്ട്രീം നഷ്ടപ്പെട്ടാൽ, ചാറ്റ് വീണ്ടും കണക്ട് ചെയ്യുന്നു, സെർവർ അടുത്തിടെയുള്ള ഇവന്റുകൾ 120 സെക്കൻഡ് പിടിക്കുന്ന ബഫറിൽ നിന്ന് വീണ്ടും പ്ലേ ചെയ്യുന്നു. ടേൺ അവസാനിക്കുമ്പോൾ, ചാറ്റ് സെർവറിനോട് സേവ് ചെയ്ത ചരിത്രം ചോദിക്കുകയും അത് കാണിച്ചതും സംഭരിച്ചതും ഒത്തുനോക്കുകയും ചെയ്യുന്നു. ആ അവസാന ഘട്ടം സ്ട്രീം വിട്ടുപോയതെന്തും പിടിക്കുന്നു.
ഒന്നും സംഭവിക്കാത്തപ്പോൾ ജീവനുള്ള കണക്ഷനും ചത്ത കണക്ഷനും തിരിച്ചറിയാൻ, സെർവർ ഓരോ 15 സെക്കൻഡിലും ഒരു ചെറിയ "ping" അയക്കുന്നു.
ബഗ് 1: ഉണരുന്നത് ആരോഗ്യകരമായ സ്ട്രീമിനെ കൊന്നു
ബ്രൗസറുകൾ, ഒരു പേജ് വീണ്ടും ദൃശ്യമാകുമ്പോൾ അതിനോട് പറയുന്നു: ടാബ് മാറ്റിയ ശേഷം, സ്ക്രീൻ അൺലോക്ക് ചെയ്ത ശേഷം. കണക്ഷൻ പരിശോധിക്കാനുള്ള സൂചനയായി ഞങ്ങൾ അത് ഉപയോഗിച്ചു — പ്രായോഗികമായി, സ്ട്രീം അബോർട്ട് ചെയ്ത് വീണ്ടും കണക്ട് ചെയ്യാൻ, അത് മറഞ്ഞിരിക്കുമ്പോൾ ചത്തുപോയെന്ന് കരുതി.
ഫോണുകളിലും എംബെഡഡ് ബ്രൗസറുകളിലും ഈ ഇവന്റുകൾ സ്ട്രീമുകൾ ചാവുന്നതിനേക്കാൾ വളരെ കൂടുതൽ തവണ ഫയർ ചെയ്യുന്നു — ഓരോ ടാബ് മാറ്റവും, ഓരോ അൺലോക്കും, ചില എംബെഡഡ് ബ്രൗസറുകളിൽ ഓരോ രണ്ട് സെക്കൻഡിലും ഏകദേശം. ഓരോന്നും ആരോഗ്യകരമായ ഒരു സ്ട്രീം അബോർട്ട് ചെയ്തു. ചാറ്റ് വീണ്ടും കണക്ട് ചെയ്തു, റീപ്ലേ ചെയ്തു, വീണ്ടും അബോർട്ട് ചെയ്യപ്പെട്ടു, ഒടുവിൽ "Connecting…" എന്നതിൽ ഇരുന്നു. പിന്നീട് ഏജന്റ് ഇപ്പോഴും പ്രവർത്തിക്കുമ്പോൾ ടേൺ അവസാനിച്ചു എന്ന് പറഞ്ഞു.
പരിഹാരം: സ്ട്രീം സംസാരിക്കുന്നുണ്ടോ എന്ന് നോക്കി വിധിക്കുക
ഓരോ പ്രോജക്റ്റിന്റെയും സ്ട്രീം അവസാനമായി എന്തെങ്കിലും സ്വീകരിച്ചത് എപ്പോഴെന്ന് ചാറ്റ് ഇപ്പോൾ രേഖപ്പെടുത്തുന്നു — ഇവന്റുകളും 15-സെക്കൻഡ് pings-ഉം ഒരുപോലെ. "വീണ്ടും ദൃശ്യമായി" എന്ന സിഗ്നൽ 25 സെക്കൻഡ് നിശബ്ദമായ സ്ട്രീമിനെ മാത്രമേ അബോർട്ട് ചെയ്യൂ: ping ഇടവേളയും ഒരു മന്ദഗതിയിലുള്ള നെറ്റ്വർക്ക് ഹോപ്പും കൂട്ടിയതിനേക്കാൾ നീളം, അതിനാൽ ജീവനുള്ള സ്ട്രീം ഒരിക്കലും അതിൽ വരില്ല. ഒരു ping ജീവന്റെ അടയാളമായി കണക്കാകുന്നുവെന്നും, ഇപ്പോൾ ping ചെയ്ത സ്ട്രീമിനെ ചത്തതായി കണക്കാക്കില്ലെന്നും ടെസ്റ്റുകൾ പരിശോധിക്കുന്നു.
ഞങ്ങൾ അതിൽ നിന്ന് എടുത്ത നിയമം: ഒരു പേജിന്റെ ദൃശ്യത ആ പേജിനെക്കുറിച്ചാണ് പറയുന്നത്, നെറ്റ്വർക്ക് കണക്ഷനെക്കുറിച്ചല്ല. കണക്ഷനോട് ചോദിക്കുക.
ബഗ് 2: ഫോൺ ഉണർന്നപ്പോൾ പകുതി മറുപടി
ഇത് ഞങ്ങൾക്ക് iOS സിമുലേറ്ററിൽ ഓരോ തവണയും പുനഃസൃഷ്ടിക്കാനായി:
- ഒരു പുതിയ ചാറ്റ് തുടങ്ങി, കുറച്ച് സമയമെടുക്കുന്ന ഒരു അഭ്യർത്ഥന അയക്കുക.
- ബിൽഡിനിടയിൽ ഫോൺ ഉറങ്ങാൻ അനുവദിക്കുക.
- ടേൺ കഴിഞ്ഞ ശേഷം, രണ്ട് മിനിറ്റ് റീപ്ലേ ബഫർ കാലഹരണപ്പെട്ട ശേഷം തിരികെ വരിക.
ചാറ്റ് മറുപടിയുടെ ആദ്യ കുറച്ച് ബ്ലോക്കുകൾ കാണിച്ചു, പൂർത്തിയായതായി അടയാളപ്പെടുത്തി — പേജ് റീഫ്രഷ് ചെയ്യുന്നതുവരെ അങ്ങനെ തന്നെ നിന്നു.
എന്തുകൊണ്ട്
ഒരു പുതിയ ചാറ്റിന് ഇതുവരെ ഒരു thread ഇല്ല — അതായത് സേവ് ചെയ്ത സംഭാഷണം — ആദ്യ സന്ദേശം അത് സൃഷ്ടിക്കുന്നതുവരെ. അത് send ഫംഗ്ഷനിനുള്ളിൽ നടക്കുന്നു, ശേഷം send reconcile ഘട്ടം പിടിച്ചെടുത്തുകഴിഞ്ഞു, ആ ഘട്ടം ഇപ്പോഴും thread ഇല്ലെന്ന് കരുതി. അതിനാൽ പുതിയ ചാറ്റിലെ ആദ്യ ടേണിന്റെ അവസാനം, reconcile thread കണ്ടില്ല, ഒന്നും ചോദിക്കാതെ നിശബ്ദമായി മടങ്ങി.
സാധാരണയായി ആരും ശ്രദ്ധിച്ചില്ല, കാരണം സ്ട്രീം ടേൺ മുഴുവൻ എത്തിച്ചിരുന്നു. പക്ഷേ ടേണിലുടനീളം ഉറങ്ങിയ ഫോൺ, റീപ്ലേ ബഫർ കാലഹരണപ്പെട്ട ശേഷം തിരികെ വന്നപ്പോൾ, സ്ട്രീമിൽ നിന്ന് നഷ്ടമായ ഇവന്റുകൾ ലഭിക്കാനായില്ല — വിടവ് നികത്തേണ്ടിയിരുന്ന reconcile ഒരിക്കലും പ്രവർത്തിച്ചിരുന്നുമില്ല.
പരിഹാരം
- Send, reconcile-നോട് ടേൺ ഏത് thread-ന്റേതാണെന്ന് പറയുന്നു, അതിനാൽ പുതിയ ചാറ്റിലെ ആദ്യ ടേണും മറ്റേതുപോലെ reconcile ചെയ്യപ്പെടുന്നു. മറുപടി തിരികെ വരുമ്പോഴേക്കും നിങ്ങൾ മറ്റൊരു ചാറ്റ് തുറന്നിരുന്നെങ്കിൽ, ഫലം തെറ്റായ സ്ഥലത്ത് കാണിക്കുന്നതിന് പകരം ഒഴിവാക്കപ്പെടുന്നു.
- പരാജയപ്പെട്ട reconcile വീണ്ടും ശ്രമിക്കുന്നു. മോശം കണക്ഷനിൽ ഉണരുന്ന ഫോൺ, ടേൺ കഴിഞ്ഞിരിക്കുന്നതായി കണ്ടെത്തിയിട്ടും അത് ലഭ്യമാക്കുന്നതിൽ പരാജയപ്പെടാം. അത് ഇപ്പോൾ ഓർത്തുവെക്കുന്നു, ടാബ് വീണ്ടും കാണിക്കുമ്പോഴോ നെറ്റ്വർക്ക് തിരികെ വരുമ്പോഴോ ചാറ്റ് വീണ്ടും ചോദിക്കുന്നു.
- "Worked for" സത്യസന്ധമാണ്. ഓരോ മറുപടിയും ഏജന്റ് എത്ര നേരം പ്രവർത്തിച്ചു എന്ന് കാണിക്കുന്നു. ടാബ് സെർവറിന്റെ ടേൺ-അവസാന സന്ദേശം കണ്ടിട്ടില്ലെങ്കിൽ, മുമ്പ് അത് സ്വന്തം ക്ലോക്കിൽ നിന്ന് ആ ഭാഗം നിറയ്ക്കുമായിരുന്നു — Send മുതൽ ഫോൺ ഉണരുന്നതുവരെ, ദൂരത്തിരുന്ന സമയം ഉൾപ്പെടെ. ആ കണക്ക് ഇപ്പോൾ ഒരു ഏകദേശ കണക്കായി അടയാളപ്പെടുത്തുന്നു, ചരിത്രം എത്തുമ്പോൾ സംഭരിച്ച ദൈർഘ്യം കൊണ്ട് മാറ്റുന്നു.
ഞങ്ങൾ പഠിച്ചത്
- ആളുകൾ ഉപയോഗിക്കുന്ന ഉപകരണത്തിൽ, അവർ ഉപയോഗിക്കുന്ന രീതിയിൽ പരീക്ഷിക്കുക. രണ്ട് ബഗുകളും "പ്രവർത്തിക്കുന്ന ഒരു സ്ട്രീം", "പോക്കറ്റിലുള്ള ഒരു ഫോൺ" എന്നിവയ്ക്കിടയിലെ വിടവിലാണ് ജീവിച്ചത്.
- ഒരിക്കലും പ്രവർത്തിക്കാത്ത ഒരു ബാക്കപ്പ് ബാക്കപ്പല്ല. reconcile ഘട്ടം ഈ കേസ് പിടിക്കാൻ നിലവിലുണ്ടായിരുന്നു, പക്ഷേ നിശബ്ദമായി അത് ഒഴിവാക്കി.
- വീണ്ടെടുക്കലും വീണ്ടും ശ്രമിക്കുക. ഫോൺ ഉണരുന്ന നിമിഷം പലപ്പോഴും അതിന്റെ കണക്ഷൻ ഏറ്റവും മോശമായിരിക്കുന്ന സമയമാണ്.
- ഒരു ഊഹം വസ്തുതയായി കാണിക്കരുത്. തെറ്റായ ക്ലോക്കിൽ നിന്നുള്ള ദൈർഘ്യം ഇല്ലാത്തതിനേക്കാൾ മോശമാണ്; അത് ലേബൽ ചെയ്യുക അല്ലെങ്കിൽ മാറ്റിസ്ഥാപിക്കുക.
അതേ ജോലി ടേൺ പ്രവർത്തിക്കുമ്പോൾ നിങ്ങൾ കാണുന്ന ചില കാര്യങ്ങളും ഒതുക്കി: ഷെൽ ഘട്ടങ്ങൾ cd-ക്ക് പകരം ജോലി ചെയ്യുന്ന കമാൻഡ് വെച്ച് ലേബൽ ചെയ്യുന്നു, ചാറ്റിലെ സ്ക്രീൻഷോട്ടുകൾ പേജിന്റെ മുകളിൽ-ഇടത് നിലനിർത്തി കോളത്തിൽ ഒതുങ്ങുന്നു, പുതിയ പ്രോജക്റ്റ് റീഫ്രഷ് ചെയ്യാതെ അതിന്റെ സൃഷ്ടിച്ച പേര് എടുക്കുന്നു.
നിങ്ങൾ ഫോണുകൾക്കായി സ്വന്തം ആപ്പ് നിർമ്മിക്കുകയാണെങ്കിൽ, മൊബൈൽ-സൗഹൃദ വെബ് ആപ്പ് നിർമ്മിക്കുന്നത്, നേറ്റീവ് vs പ്രോഗ്രസീവ് വെബ് ആപ്പുകൾ എന്നീ ഗൈഡുകൾ അടിസ്ഥാനകാര്യങ്ങൾ കവർ ചെയ്യുന്നു. ചാറ്റിനെക്കുറിച്ച് കൂടുതൽ ചാറ്റ് ഡോക്സിൽ ഉണ്ട്.