প্রোটোকল বাফারস 3 এ প্রয়োজনীয় এবং alচ্ছিক কেন সরানো হয়েছে


214

আমি সম্প্রতি ব্যবহার করছি gRPCসঙ্গে proto3, এবং আমি যে খেয়াল করেছি requiredএবং optionalনতুন সিনট্যাক্স মধ্যে সরানো হয়েছে।

প্রোটো 3-তে প্রয়োজনীয় / alচ্ছিক অপসারণ কেন কেউ দয়া করে ব্যাখ্যা করতে পারবেন? এই জাতীয় সীমাবদ্ধতাগুলি কেবল সংজ্ঞাটিকে শক্তিশালী করার জন্য প্রয়োজনীয় বলে মনে হয়।

সিনট্যাক্স প্রোটো 2:

message SearchRequest {
  required string query = 1;
  optional int32 page_number = 2;
  optional int32 result_per_page = 3;
}

সিনট্যাক্স প্রোটো 3:

syntax = "proto3";
message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
}

উত্তর:


389

এর উপযোগিতা requiredঅনেক বিতর্ক এবং শিখা যুদ্ধের কেন্দ্রবিন্দুতে রয়েছে। উভয় পক্ষেই বড় বড় ক্যাম্প রয়েছে। একটি শিবির একটি মান উপস্থিত থাকার গ্যারান্টি পছন্দ করেছিল এবং তার সীমাবদ্ধতাগুলি নিয়ে বেঁচে থাকতে রাজি ছিল তবে অন্য শিবিরটি requiredবিপজ্জনক বা অপ্রয়োজনীয় বলে মনে হয়েছিল কারণ এটি নিরাপদে যুক্ত করা বা অপসারণ করা যায় না।

requiredক্ষেত্রগুলি কেন অল্প ব্যবহার করা উচিত তার আরও যুক্তি দিয়ে আমাকে আরও ব্যাখ্যা করতে দিন। আপনি যদি ইতিমধ্যে একটি প্রোটো ব্যবহার করেন তবে আপনি প্রয়োজনীয় ক্ষেত্রটি যুক্ত করতে পারবেন না কারণ পুরানো অ্যাপ্লিকেশনগুলি সেই ক্ষেত্রটি সরবরাহ করবে না এবং সাধারণভাবে অ্যাপ্লিকেশনগুলি ব্যর্থতাটি ভালভাবে পরিচালনা করে না। আপনি নিশ্চিত করতে পারেন যে সমস্ত পুরানো অ্যাপ্লিকেশনগুলি প্রথমে আপগ্রেড করা হয়েছে তবে এটি ভুল করা সহজ হতে পারে এবং আপনি যদি কোনও ডেটাস্টোর (এমনকি স্বল্পস্থায়ী, যেমন মেমক্যাচড) তে প্রোটোগুলি সংরক্ষণ করে থাকেন তবে তাতে কোনও লাভ হয় না । প্রয়োজনীয় ক্ষেত্রটি সরানোর সময় একই ধরণের পরিস্থিতি প্রযোজ্য।

অনেকগুলি প্রয়োজনীয় ক্ষেত্র "স্পষ্টতই" প্রয়োজনীয় ছিল যতক্ষণ না ... তারা ছিল না। ধরা যাক আপনার idএকটি Getপদ্ধতির ক্ষেত্র রয়েছে । এটা অবশ্যই প্রয়োজন। বাদে, পরে আপনার প্রয়োজনটি idইনট থেকে স্ট্রিংয়ে বা ইন্ট 32 থেকে ইনট to৪ এ পরিবর্তন করতে হবে। এর জন্য একটি নতুন muchBetterIdক্ষেত্র যুক্ত করা দরকার , এবং এখন আপনাকে সেই পুরানো idক্ষেত্রটি রেখে দেওয়া হবে যা নির্দিষ্ট করতে হবে তবে শেষ পর্যন্ত সম্পূর্ণ উপেক্ষা করা হবে।

যখন এই দুটি সমস্যা একত্রিত হয়, তখন উপকারী requiredক্ষেত্রগুলির সংখ্যা সীমাবদ্ধ হয়ে যায় এবং শিবিরগুলি এখনও এর মূল্য আছে কিনা তা নিয়ে তর্ক করে। এর বিরোধীরা requiredঅগত্যা ধারণাটির বিরুদ্ধে ছিল না, তবে এটির বর্তমান রূপটি। কেউ কেউ আরও বেশি সংবেদনশীল বৈধতা গ্রন্থাগার গড়ে তোলার পরামর্শ দিয়েছিলেন requiredযা আরও উন্নত জাতীয় কিছু পরীক্ষা করতে পারে name.length > 10এবং আরও ভাল ব্যর্থতার মডেলটি নিশ্চিত করে তোলে।

প্রোটো 3 সামগ্রিকভাবে সরলতার পক্ষে বলে মনে হচ্ছে এবং requiredঅপসারণটি সহজ। তবে সম্ভবত আরও requiredদৃ ,়প্রত্যয়ী, অন্যান্য বৈশিষ্ট্যগুলির সাথে মিলিত হয়ে প্রোটো 3 এর বোধগম্যতা সরিয়ে ফেলা যেমন আদিমদের জন্য ক্ষেত্রের উপস্থিতি অপসারণ এবং ওভাররাইডিং ডিফল্ট মানগুলি অপসারণ।

আমি প্রোটোবুফ বিকাশকারী নই এবং কোনওভাবেই এই বিষয়ে অনুমোদিত নয়, তবে আমি এখনও আশা করি যে ব্যাখ্যাটি কার্যকর হবে।


23
হাঁ। প্রয়োজনীয় ক্ষেত্রগুলির সাথে মারাত্মকভাবে ভুল হতে পারে এমন বিষয়গুলির এই বর্ধিত ব্যাখ্যাটি দেখুন: ক্যাপনপ্রোটো.আর.এ.এইচ
কেন্টন ভারদা

8
Ptionচ্ছিক সরানো হয়নি; প্রোটো 3 এ সবকিছুই .চ্ছিক। তবে হ্যাঁ, ক্ষেত্র দৃশ্যমানতা (has_field) জন্য সরানো হয়েছে প্রিমিটিভের । আপনার যদি ক্ষেত্রের দৃশ্যমানতার প্রয়োজন হয় তবে র্যাপার্স.প্রোটো ব্যবহার করুন যার বার্তাগুলি রয়েছে StringValue। যেহেতু তারা বার্তা, হ্যাসফিল্ড উপলব্ধ। এটি কার্যকরভাবে "বক্সিং" যা বহু ভাষায় প্রচলিত।
এরিক অ্যান্ডারসন

9
বিপরীতে, দেখে মনে হচ্ছে প্রোটো 3-তে "alচ্ছিক" সরিয়ে ফেলা হয়েছে। প্রতিটি ক্ষেত্র বিদ্যমান এবং এটি একটি ডিফল্ট মান দিয়ে পূর্ণ। আপনার জানার কোনও উপায় নেই যে আদিম ক্ষেত্রটি ব্যবহারকারী দ্বারা পূরণ করা হয়েছিল, বা ডিফল্টরূপে। বার্তা ক্ষেত্রগুলি, যা মূলত পয়েন্টার হয়, optionচ্ছিক, যাতে তাদের নাল মান হতে পারে।
ভব্রান্ট

14
আমার মনে হচ্ছে প্রোটোবফ শিখা যুদ্ধগুলি শুরু করার জন্য স্পষ্টভাবে তৈরি করা একটি ভাষা
র্যান্ডি এল

5
দেখে মনে হচ্ছে বেশিরভাগ লোকেরা তাদের এপিআই এর সংস্করণ দিতে চায় না। "পশ্চাদপদ সামঞ্জস্য" এর জন্য সবকিছুকে alচ্ছিক করা তাদের পক্ষে সহজ।
হোলোসো

41

আপনি এই প্রোটোবুফ গিথুব ইস্যুতে ব্যাখ্যাটি খুঁজে পেতে পারেন :

আমরা প্রোটো 3 এ প্রয়োজনীয় ক্ষেত্রগুলি বাদ দিয়েছি কারণ প্রয়োজনীয় ক্ষেত্রগুলি সাধারণত ক্ষতিকারক এবং প্রোটোবুফের সামঞ্জস্যতা শব্দার্থবিধি লঙ্ঘন হিসাবে বিবেচিত হয়। প্রোটোবুফ ব্যবহারের সম্পূর্ণ ধারণাটি হ'ল এটি আপনাকে নতুন / পুরানো বাইনারিগুলির সাথে পুরোপুরি সামনের / পশ্চাদপটে সামঞ্জস্য থাকা অবস্থায় আপনার প্রোটোকল সংজ্ঞা থেকে ক্ষেত্রগুলি যুক্ত / সরিয়ে ফেলতে দেয়। প্রয়োজনীয় ক্ষেত্রগুলি যদিও এটি ভঙ্গ করে। আপনি কখনই কোনও ব্যক্তিগত ক্ষেত্রকে .রফোটো সংজ্ঞাতে সুরক্ষিতভাবে যুক্ত করতে পারবেন না বা কোনও বিদ্যমান প্রয়োজনীয় ক্ষেত্রটি আপনি নিরাপদে সরাতে পারবেন না কারণ এই দুটি পদক্ষেপই তারের সামঞ্জস্যতা ভঙ্গ করে। উদাহরণস্বরূপ, আপনি যদি একটি প্রফিট সংজ্ঞাটিতে প্রয়োজনীয় ক্ষেত্র যোগ করেন তবে নতুন সংজ্ঞা দিয়ে নির্মিত বাইনারিগুলি পুরানো সংজ্ঞা ব্যবহার করে ক্রমিকিত ডেটা পার্স করতে সক্ষম হবে না কারণ প্রয়োজনীয় ক্ষেত্রটি পুরানো ডেটাতে উপস্থিত নয়। একটি জটিল ব্যবস্থা যেখানে। প্রোটো সংজ্ঞাগুলি সিস্টেমের বিভিন্ন উপাদানগুলিতে বিস্তৃতভাবে ভাগ করা হয়, প্রয়োজনীয় ক্ষেত্রগুলি যুক্ত / অপসারণের ফলে সিস্টেমের একাধিক অংশ সহজেই আনা যায়। আমরা এই একাধিকবার উত্পাদনের সমস্যাগুলি দেখেছি এবং যে কেউ প্রয়োজনীয় ক্ষেত্রগুলি যুক্ত / সরানোর জন্য গুগলের অভ্যন্তরে সর্বত্র এটি নিষিদ্ধ। এই কারণে আমরা প্রোটো 3 এ প্রয়োজনীয় ক্ষেত্রগুলি সম্পূর্ণরূপে সরিয়েছি।

"প্রয়োজনীয়" অপসারণের পরে, "alচ্ছিক" কেবলমাত্র অপ্রয়োজনীয় তাই আমরা পাশাপাশি "alচ্ছিক" অপসারণ করেছি।


6
আমি পাই না; ডিসিরিয়ালাইজিংয়ের পরে কোনও বার্তা ফেলে দেওয়ার এবং ডিসিরিয়ালাইজেশনের মধ্যে পার্থক্য কী? এটি পুরানো ক্লায়েন্ট দ্বারা নামিয়ে দেওয়া হবে কারণ এটিতে প্রয়োজনীয় ক্ষেত্র নেই (যেমন আইডি)।
শমুয়েল এইচ।

6
আমি @ শিমুয়েলএইচ এর সাথে একমত হতে আগ্রহী। প্রয়োজনীয় ক্ষেত্রগুলি একটি উপায় বা অন্য কোনও এপিআইয়ের অংশ হতে চলেছে। ভাল যে উভয় পক্ষের দেওয়া সিনট্যাক্সের মাধ্যমে স্বয়ংক্রিয়ভাবে সমর্থিত, বা ব্যাকএন্ডে লুকানো আছে, এটি এখনও রয়েছে। এপিআই সংজ্ঞায় এটিও দৃশ্যমান করে তুলতে পারে
ক্রંચার

7
আমি @ শমুয়েলএইচ এর সাথে সম্পূর্ণ সম্মত। ক্ষেত্রগুলির জন্য একটি API বা অন্য কোনও উপায়ে প্রয়োজনীয় এবং এটি জানতে গ্রাহকের পক্ষে এটি দরকারী। এটি আমাকে ভাবতে বাধ্য করে যে আমরা ঠিক এখন পর্যন্ত সংস্করণ পেয়েছি না।
প্যাট্রিকবার্কার

6
@ শমুয়েলএইচ এর জন্য আর একটি ভোট। যদি আপনি আপনার এপিআইটিকে পিছনের দিকে-অসামঞ্জস্যভাবে (প্রয়োজনীয় ক্ষেত্র যুক্ত করে) পরিবর্তন করেন তবে অবশ্যই আপনি চান যে আপনার পার্সার এটি সনাক্ত করতে পারে? আপনার API গুলি সংস্করণ! এমনকি আপনি যদি এটি ব্যবহার করেন তবে প্রোটোবুফে এটি সম্পূর্ণরূপে করতে পারেন oneof { MessageV1, MessageV2, etc. }
টিম্ম্ম্ম

1
এটি প্রাথমিকভাবে প্রয়োজনীয় ক্ষেত্রগুলি যুক্তিযুক্ত করতে পারেনি। এবং প্রয়োজনীয় ক্ষেত্রটি যুক্ত করা বেমানান পরিবর্তন এবং সাধারণত প্রোটোকল সংস্করণ পরিবর্তন (যেমন একটি নতুন বার্তার প্রকার) দ্বারা পরিচালনা করা উচিত।
ক্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.