SOCKS റിലേയിലെ ഫുൾ-ഡ്യുപ്ലക്സ് ഫ്ലോയും ബാക്ക്പ്രഷറും
ഏകദേശ റെസ്പോൺസ് വലുപ്പങ്ങൾക്ക് പകരം സ്വതന്ത്ര ബൈറ്റ് സ്ട്രീമുകൾ, ഭാഗിക I/O, പരിധിയുള്ള ബഫറുകൾ, ബാക്ക്പ്രഷർ എന്നിവയെ അടിസ്ഥാനമാക്കി റിലേ ഫ്ലോ രൂപകൽപ്പന ചെയ്യുക.
SOCKS ഹാൻഡ്ഷേക്ക് വിജയിച്ചു. ഇപ്പോൾ റിലേ ക്ലയന്റിൽ നിന്ന് വായിക്കുന്നു, ലക്ഷ്യസ്ഥാനത്തേക്ക് എഴുതുന്നു, പൂർണ്ണ റെസ്പോൺസിനായി കാത്തിരിക്കുന്നു, അതിനുശേഷം മാത്രം വീണ്ടും ക്ലയന്റിൽ നിന്ന് വായിക്കുന്നു. ആ ക്രമം പൂർണ്ണമായി സാധുവായ ഒരു ആപ്ലിക്കേഷനെ ഡെഡ്ലോക്ക് ചെയ്യാം.
TCP ടണൽ സ്ഥാപിച്ചുകഴിഞ്ഞാൽ, അതിനുള്ളിലെ സന്ദേശങ്ങൾ SOCKS നിർവചിക്കുന്നില്ല. ലക്ഷ്യസ്ഥാനം ആദ്യം അയച്ചേക്കാം. ഇരുവശവും സ്വതന്ത്രമായി അയച്ചേക്കാം. ഒരു വശം ഒരു ചെറിയ റെക്കോർഡ് അയച്ചശേഷം മറുവശത്തിന്റെ ഉത്തരത്തിനായി കാത്തിരിക്കാം.
ഊഹിച്ച ഇടപാടുകളല്ല, ബൈറ്റുകൾ കൈമാറുക
ഒരു റിസീവ് കോൾ അതിന്റെ ഫ്ലാഗുകളും സോക്കറ്റ് അവസ്ഥയും അനുസരിച്ച് ലഭ്യമായ ബൈറ്റുകൾ നൽകുന്നു. ഒരു പൊതു റിലേയോട് ആപ്ലിക്കേഷൻ റെസ്പോൺസ് പൂർത്തിയായി എന്ന് അത് പറയുന്നില്ല. ഏകപക്ഷീയമായ വലിയ ബഫർ നിറയുന്നതുവരെ കാത്തിരിക്കുന്നത്, മറുവശം തുടരാൻ ആവശ്യമായ ചെറിയ സന്ദേശം കൈമാറുന്നത് തടയാം.
ഇരു ദിശകളും കൈകാര്യം ചെയ്യാൻ ആപ്ലിക്കേഷന്റെ നിലവിലുള്ള കൺകറൻസി മോഡൽ ഉപയോഗിക്കുക: ഒരു ഇവന്റ് ലൂപ്പ്, അസിങ്ക്രണസ് I/O, അല്ലെങ്കിൽ ബോധപൂർവം തിരഞ്ഞെടുത്ത മറ്റൊരു രൂപകൽപ്പന. ഒരു ദിശയിലെ പുരോഗതിക്ക് മറുദിശയിൽ കെട്ടിച്ചമച്ച ഒരു സന്ദേശ അതിർത്തി ആവശ്യമില്ല എന്നതാണ് പ്രധാന സ്വഭാവം.
രണ്ട് പരിധിയുള്ള പെൻഡിംഗ് ബഫറുകൾ സൂക്ഷിക്കുക
ക്ലയന്റിൽ നിന്ന് വായിച്ച ഡാറ്റ ഇപ്പോഴും ലക്ഷ്യസ്ഥാനത്ത് എത്താൻ കാത്തിരിക്കാം, അതേസമയം ലക്ഷ്യസ്ഥാനത്തുനിന്നുള്ള ഡാറ്റ ക്ലയന്റിൽ എത്താൻ കാത്തിരിക്കുന്നു. ആ പെൻഡിംഗ് ബൈറ്റുകൾ വെവ്വേറെ ട്രാക്ക് ചെയ്യുക.
ഒരു സെൻഡ് ആവശ്യപ്പെട്ടതിനേക്കാൾ കുറച്ച് ബൈറ്റുകൾ എഴുതിയേക്കാം. എഴുതാത്ത ഭാഗം സൂക്ഷിക്കുക; അത് ഉപേക്ഷിക്കരുത്, മുഴുവൻ ബഫറും വീണ്ടും പ്ലേ ചെയ്യരുത്. താൽക്കാലികമായി എഴുതാൻ കഴിയാത്ത സോക്കറ്റ് ശരിയായ റെഡിനസ് ഇവന്റിനായി കാത്തിരിക്കാനുള്ള കാരണമാണ്, തുടർച്ചയായി കറങ്ങാനല്ല.
ബഫറുകൾ പരിധിനിർണ്ണയം ചെയ്യുക. ലക്ഷ്യസ്ഥാനം മന്ദഗതിയിലാണെങ്കിൽ, പരിധിയില്ലാതെ ക്ലയന്റ് ഡാറ്റ വായിച്ചുകൊണ്ടിരിക്കുന്നത് ക്യൂവിനെ റിലേയുടെ മെമ്മറിയിലേക്ക് മാറ്റുന്നു എന്നു മാത്രം. ബാക്ക്പ്രഷർ എന്നത് ബന്ധപ്പെട്ട പെൻഡിംഗ് ബഫർ നിറയുമ്പോൾ വായന താൽക്കാലികമായി നിർത്തുന്നതും, എഴുത്തുകൾ ഇടം നൽകുമ്പോൾ പുനരാരംഭിക്കുന്നതുമാണ്.
ഒരു ദിശയിലെ അവസാനത്തിന് ഒരു നയം വേണം
മറുദിശയിൽ ഇപ്പോഴും ഉപയോഗപ്രദമായ ഡാറ്റ ഉള്ളപ്പോൾ TCP ഒരു അയയ്ക്കൽ ദിശ അടയ്ക്കാം. ബഫർ ചെയ്ത ബൈറ്റുകൾ തീർന്നശേഷം ആ അവസ്ഥ എങ്ങനെ കൈമാറണം എന്ന് തീരുമാനിക്കുക, കൂടാതെ ക്രമമായ അടയ്ക്കൽ പിശകിൽനിന്നോ സമയപരിധിയിൽനിന്നോ വേർതിരിക്കുക.
ഇതൊന്നും റിലേ ആപ്ലിക്കേഷന്റെ പേലോഡ് ഡീക്രിപ്റ്റ് ചെയ്യണമെന്നോ പാഴ്സ് ചെയ്യണമെന്നോ ആവശ്യപ്പെടുന്നില്ല. ശരിയായ സ്ട്രീം കൈകാര്യം ആവശ്യമാണ്. ബഫർ വലുപ്പം കൂട്ടുന്നത് മാത്രം തെറ്റായ വശത്തിനായി കാത്തിരിക്കുന്നതോ ഓരോ വായനയും ഒരു മുഴുവൻ അഭ്യർത്ഥനയ്ക്ക് തുല്യമാണെന്ന് കരുതുന്നതോ ആയ റിലേയെ നന്നാക്കാൻ കഴിയില്ല.