একটি ব্যর্থতা একটি বাল্ক অপারেশন ব্যর্থ করা উচিত?


11

এপিআইতে আমি কাজ করছি সেখানে একটি বাল্ক মুছুন অপারেশন যা আইডির একটি অ্যারে গ্রহণ করে:

["1000", ..., "2000"]

আমি ফিট দেখে মুছে ফেলা অপারেশনটি বাস্তবায়িত করতে স্বাধীন ছিলাম, তাই আমি পুরো জিনিসটি লেনদেনের সিদ্ধান্ত নিয়েছিলাম: এটি হ'ল কোনও একক আইডি যদি অবৈধ হয় তবে পুরো অনুরোধটি ব্যর্থ হয়। আমি এটিকে কঠোর মোড বলব ।

try{
savepoint = conn.setSavepoint();

for(id : IDs)
    if( !deleteItem(id) ){
        conn.rollback(savepoint);
        sendHttp400AndBeDoneWithIt();
        return;
    }

conn.commit();
}

বিকল্প (আমাদের সফ্টওয়্যার স্যুটে অন্য কোথাও প্রয়োগ করা) হ'ল ব্যাকএন্ডে আমরা যা করতে পারি তা করা এবং অ্যারেতে ব্যর্থতার প্রতিবেদন করা। সফ্টওয়্যারটির সেই অংশটি কম অনুরোধগুলির সাথে কাজ করে যাতে তাত্ত্বিকভাবে প্রতিক্রিয়াটি বিশালাকার অ্যারে হিসাবে শেষ হয় না।


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

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


9
এটা নির্ভর করে. কোনও কিছু যখন মুছে ফেলা না হয় সেটির দাম কী? (ব্যয়কে খারাপ ডেটা, মাথা ব্যথা, অনাকাঙ্ক্ষিত আচরণ, এটি ঠিক করার জন্য প্রশাসকের যে সময় লাগে ইত্যাদি ইত্যাদি হিসাবে সংজ্ঞায়িত হচ্ছে) তা কি গ্রহণযোগ্য? আপনি যদি সবকিছু ব্যর্থ না করার পরিণতি নিয়ে বেঁচে থাকতে পারেন তবে এর জন্য যান। এটি যদি খুব বেশি সমস্যার সৃষ্টি করে তবে তা করবেন না। আপনি নিজের সফ্টওয়্যার এবং এর পরিণতিগুলি জানেন, তাই আপনাকে রায় দেওয়ার জন্য কল করতে হবে।
বেকুজ

1
@ ব্যাকুজের জন্য ব্যয় হবে ব্যবহারকারী এক বা দু'জন রেখে যাওয়া লক্ষ্য করে এবং সে সম্পর্কে টিকিট খোলার; বর্তমান পরিস্থিতি হ'ল "ওএমজি মুছে ফেলা হয়েছে"। ভাগ্যক্রমে ব্যবহারকারী হলওয়েতে নিচে রয়েছে সুতরাং এটি এখন কোনও সমস্যার বেশি নয়। মুল বক্তব্যটি হ'ল আমি যখনই সম্ভব সঠিক কাজটি করতে চাই এবং 10+ বছরের পুরানো কোডবেস দিয়ে Godশ্বর জানেন যে কিছু জিনিস সঠিকভাবে করা হতে পারে
রথ

আমি মনে করি এটি আপনি স্কেলিবিলিটি চান কিনা তার উপরও নির্ভর করে। যদি আপনার প্রচুর আইডি থাকার ইচ্ছা না থাকে তবে এটি খুব বেশি গুরুত্বপূর্ণ নয়। যদি আপনি লক্ষ লক্ষ আইডি রাখার ইচ্ছে করে থাকেন বা আরও ভাল, এটি ঘটবে না তা নিশ্চিত না হন, তবে 1 টি অবৈধ আইডির কারণে আপনি এটি সম্পূর্ণরূপে পুনরায় সেট করতে আইডি মুছতে এক ঘন্টা ব্যয় করতে পারেন।
imnota4

1
@ imnota4 একটি দুর্দান্ত পয়েন্ট যা আমি বিবেচনা করি নি। ইউআইটি অনুরোধটি সর্বাধিক 250 টির উপরে সীমাবদ্ধ করে, তবে ব্যাকএন্ডের কোনও বিধিনিষেধ নেই। আমি আপনাকে উত্তর হিসাবে আপনার মন্তব্য পুনরায় পোস্ট করতে বলুন?
রথ

1
পার্মিসিভ মোড অ্যাডমিনদের কাজও আরও সহজ করে তোলে কারণ তাদের আইডি এর সমস্ত স্ট্যাক সহ ব্যর্থতা পুনরুত্পাদন করার প্রয়োজন হয় না। প্রতিটি ত্রুটির কারণ প্রতিক্রিয়া জানাতে এটি কার্যকর হতে পারে। কারণটির দিকে চেয়ে, চূড়ান্ত ব্যবহারকারীর পক্ষে এটি "ওএমজি মোছা ভাঙা নেই" টিকিট ছাড়াই সমাধান করা সম্ভব।
লাইভ

উত্তর:


9

মুছে ফেলা শেষ পয়েন্টের 'কড়া' বা 'দুর্দান্ত' সংস্করণটি করা ঠিক আছে তবে কী হয়েছে তা আপনার স্পষ্টভাবে ব্যবহারকারীকে জানাতে হবে।

আমরা এই শেষ পয়েন্ট সহ একটি মোছার ক্রিয়াটি করছি। সম্ভবত DELETE /resource/bulk/বা অনুরূপ কিছু। আমি খুঁতখুঁতে না. এখানে যে বিষয়টি গুরুত্বপূর্ণ তা হ'ল আপনি কঠোর বা সুন্দর হওয়ার সিদ্ধান্ত নিচ্ছেন না কেন, আপনাকে যা ঘটেছে ঠিক তা রিপোর্ট করতে হবে।

উদাহরণস্বরূপ, আমি DELETE /v1/student/যে আইপিআই নিয়ে কাজ করেছি তার একটি শেষ পয়েন্ট ছিল যা বাল্ক আইডি গ্রহণ করে। আমরা পরীক্ষার সময় আমরা অনুরোধটি নিয়মিত পাঠিয়ে দিতাম, 200প্রতিক্রিয়া পেয়েছি এবং ধরে নিলাম যে সবকিছু ঠিক আছে, কেবল পরে তা খুঁজে বের করতে হবে যে তালিকার প্রত্যেকটিই এখনও ডাটাবেসে রয়েছেন (নিষ্ক্রিয় হয়ে রয়েছে) বা আসলে কোনও ত্রুটির কারণে মুছে ফেলা হয়নি ভবিষ্যতের কলগুলিতে বিশৃঙ্খলা তৈরি হয়েছিল GET /v1/studentকারণ আমরা প্রত্যাশা করি না এমন ডেটা ফিরে পেয়েছি।

এর সমাধানটি পরবর্তী আপডেটে এসেছিল যা মুছে ফেলা হয়নি এমন আইডির প্রতিক্রিয়ায় একটি দেহ যুক্ত করেছিল। এটি - আমার জ্ঞানের কাছে - এক ধরণের সেরা অনুশীলন।

নীচের লাইনটি, আপনি যা করেন তা নির্বিশেষ না করে নিশ্চিত করুন যে আপনি শেষ ব্যবহারকারীকে কী চলছে এবং সম্ভবত এটি কেন চলছে তা জানানোর একটি উপায় সরবরাহ করেছেন। IE, যদি আমরা একটি কঠোর ফর্ম্যাটটি বেছে নিয়ে থাকি তবে প্রতিক্রিয়া হতে পারে 400 - DELETE failed on ID 1221 not found। যদি আমরা একটি 'সুন্দর' সংস্করণ বেছে নিয়ে থাকি তবে এটি হতে পারে 207 - {message:"failed, some ids not deleted", failedids:{1221, 23432, 1224}}(আমার দুর্বল জেসন ফর্ম্যাটিংটি ক্ষমা করুন)।

শুভকামনা!


6
207 Multi-Statusআংশিক ব্যর্থতার প্রতিক্রিয়াটির জন্য উপযুক্ত হতে পারে
রিচার্ড টিঙ্গল

1
আমরা শুরু করছি! আমি আসলে এটি মনে করতে পারি না! আমি এগিয়ে যাব এবং এটির সাথে উত্তরটি আপডেট করব, যেহেতু এটি আসলে স্ট্যান্ডার্ড।
অ্যাডাম ওয়েলস

2

এক কঠোর এবং অনুমতি দেওয়া উচিত।

সাধারণত, বাল্ক লোডগুলি 2 টি পর্যায় ভেঙে ফেলা হয়:

  • ভ্যালিডেশন
  • বোঝাই

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

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


আমি ডিবি মানগুলির তুলনায় আইডিগুলিকে বৈধতা দিচ্ছি না, আমি কেবল তাদের মুছে ফেলার চেষ্টা করি এবং এটি কীভাবে চলে যায় তা দেখার জন্য বা এটি চিরতরে লাগে take এন ব্যর্থতার পরে বাতিল করা খুব যুক্তিসঙ্গত পরামর্শ বলে মনে হচ্ছে, +1
রথ

2

একটি ব্যর্থতা একটি বাল্ক অপারেশন ব্যর্থ করা উচিত?

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

প্রশ্ন 1 : 'যদি কোনও ব্যক্তি মোছা ব্যর্থ হয় তবে ব্যবহারকারীর পরিণতি কী হবে?'

উত্তরের বাকী নকশা / বাস্তবায়িত আচরণ চালানো উচিত।

যদি ওপি সাজানোর অনুসারে বলা হয়, এটি কেবল ব্যবহারকারী ব্যতিক্রমটিকে লক্ষ্য করে একটি সমস্যার টিকিট খোলে, তবে অন্যথায় অকার্যকর হয় (অ-মুছে ফেলা আইটেমগুলি পরবর্তী কাজগুলিতে প্রভাবিত করে না), তবে আমি একটি স্বয়ংক্রিয় বিজ্ঞপ্তি দিয়ে অনুমতি নিয়ে যাব তোমাকে.

ব্যবহারকারীর এগিয়ে যাওয়ার আগে যদি ব্যর্থ মুছে ফেলার সমস্যাগুলি সমাধান করা দরকার, তবে কঠোরভাবে পরিষ্কার করা ভাল।

ব্যবহারকারীর বিকল্পটি দেওয়া (উদাহরণস্বরূপ, কঠোর বা পূর্বনির্ধারিত হিসাবে অনুমতিপ্রাপ্ত সহ মূলত একটি উপেক্ষা-ব্যর্থতা পতাকা) সবচেয়ে ব্যবহারকারী বান্ধব পদ্ধতির হতে পারে।

প্রশ্ন 2 : 'যদি পরবর্তী কাজগুলি এখনও ডেটা স্টোরে মুছে ফেলা না হওয়া আইটেমগুলির সাথে সম্পাদিত হয় তবে কি কোনও ডেটা সংহতি / ধারাবাহিকতার সমস্যা থাকবে?'

আবার, উত্তরটি সেরা নকশা / আচরণ চালায়। হ্যাঁ -> কঠোর, না -> অনুমতিমূলক, হতে পারে -> কঠোর বা ব্যবহারকারী নির্বাচিত (বিশেষত যদি ফলাফলগুলি সঠিকভাবে নির্ধারণ করতে নির্ভর করতে পারে)।


0

আমি মনে করি এটি আপনি স্কেলিবিলিটি চান কিনা তার উপর নির্ভর করে। যদি আপনার প্রচুর আইডি থাকার ইচ্ছা না থাকে তবে এটি খুব বেশি গুরুত্বপূর্ণ নয়। যদি আপনি লক্ষ লক্ষ আইডি রাখার ইচ্ছে করে থাকেন বা আরও ভাল, এটি ঘটবে না তা নিশ্চিত না হন, তবে 1 টি অবৈধ আইডির কারণে আপনি এটি সম্পূর্ণরূপে পুনরায় সেট করতে আইডি মুছতে এক ঘন্টা ব্যয় করতে পারেন।


-1

আমি এখানে একটি গুরুত্বপূর্ণ বিষয়টি বলতে চাই এটি হ'ল বিপুল পরিমাণ জিনিস মুছে ফেলার জন্য।

এই আইডিগুলি কি কোনওভাবে যুক্তিযুক্তভাবে সম্পর্কিত, বা এটি কেবল কোনও সুবিধা / পারফরম্যান্স - এর ব্যাচের গ্রুপিং?

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

অন্য উত্তরটি যেমন বলেছে: যে কোনও ক্ষেত্রে "ব্যবহারকারীকে" ঠিক কী ঘটেছে তা বলুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.