আমি একটি বিদ্যমান ওয়েব পরিষেবার কয়েকটি দিকগুলি পুনরায় ফ্যাক্টর করার কাজ করছি। পরিষেবা API গুলি যেভাবে প্রয়োগ করা হয় তা হ'ল এক ধরণের "প্রসেসিং পাইপলাইন" থাকা, যেখানে ক্রম অনুসারে কাজগুলি করা হয়। আশ্চর্যজনকভাবে, পরবর্তী কাজগুলিকে আগের কাজগুলির সাথে গণনা করা তথ্যের প্রয়োজন হতে পারে এবং বর্তমানে এটি যেভাবে করা হয় তা হল "পাইপলাইন রাষ্ট্র" শ্রেণিতে ক্ষেত্র যুক্ত করে।
আমি ভাবছিলাম (এবং আশা করি?) যে পাইপলাইন ধাপগুলির মধ্যে জিলিয়ন ক্ষেত্রের সাথে ডেটা অবজেক্ট থাকার চেয়ে তথ্য ভাগ করার আরও ভাল উপায় আছে যার মধ্যে কিছু কিছু প্রক্রিয়াজাতকরণের পদক্ষেপগুলিকে বোঝায় এবং অন্যকে নয়। এই শ্রেণীর থ্রেড-নিরাপদ করে তোলা এটি একটি বড় বেদনা হবে (এটি এমনকি সম্ভব হবে কিনা তা আমি জানি না), এর আক্রমণকারীদের সম্পর্কে যুক্তি দেওয়ার কোনও উপায় নেই (এবং সম্ভবত এটির কোনওটি নেই)।
আমি কিছু অনুপ্রেরণা খুঁজে পেতে গ্যাং অফ ফোর ডিজাইনের নিদর্শনগুলির বইয়ের মাধ্যমে পেজিং করছি, তবে আমার মনে হয়নি যে সেখানে কোনও সমাধান রয়েছে (মেমেন্টো কিছুটা একই চেতনায় ছিল, তবে বেশ নয়)। আমি অনলাইনেও দেখেছি, তবে দ্বিতীয়টি আপনি "পাইপলাইন" বা "ওয়ার্কফ্লো" অনুসন্ধান করেন আপনি ইউনিক্স পাইপ তথ্য, বা মালিকানাধীন ওয়ার্কফ্লো ইঞ্জিন এবং ফ্রেমওয়ার্ক সহ প্লাবিত হবেন।
আমার প্রশ্নটি হল - আপনি কীভাবে কোনও সফ্টওয়্যার প্রসেসিং পাইপলাইনের কার্যকরকরণের রেকর্ডিংয়ের ইস্যুটিতে যোগাযোগ করবেন, যাতে পরবর্তী কাজগুলি পূর্বেরগুলির দ্বারা গণিত তথ্য ব্যবহার করতে পারে? আমার ধারণা ইউনিক্স পাইপগুলির মধ্যে প্রধান পার্থক্যটি হ'ল আপনি কেবল তাত্ক্ষণিক পূর্ববর্তী টাস্কের আউটপুট সম্পর্কে চিন্তা করবেন না।
অনুরোধ হিসাবে, কিছু ব্যবহারের ক্ষেত্রে চিত্র ব্যবহার করার জন্য সিউডোকোড:
"পাইপলাইন প্রসঙ্গ" অবজেক্টে এমন অনেকগুলি ক্ষেত্র রয়েছে যা বিভিন্ন পাইপলাইন পদক্ষেপগুলি পপুলেশন / পড়তে পারে:
public class PipelineCtx {
... // fields
public Foo getFoo() { return this.foo; }
public void setFoo(Foo aFoo) { this.foo = aFoo; }
public Bar getBar() { return this.bar; }
public void setBar(Bar aBar) { this.bar = aBar; }
... // more methods
}
পাইপলাইনের প্রতিটি পদক্ষেপও একটি বস্তু:
public abstract class PipelineStep {
public abstract PipelineCtx doWork(PipelineCtx ctx);
}
public class BarStep extends PipelineStep {
@Override
public PipelineCtx doWork(PipelieCtx ctx) {
// do work based on the stuff in ctx
Bar theBar = ...; // compute it
ctx.setBar(theBar);
return ctx;
}
}
একইভাবে একটি FooStep
অনুমানের জন্য , যার আগে অন্যান্য ডেটা সহ বারস্টেপ দ্বারা বার গণনা করা যেতে পারে। এবং তারপরে আমাদের কাছে আসল এপিআই কল রয়েছে:
public class BlahOperation extends ProprietaryWebServiceApiBase {
public BlahResponse handle(BlahRequest request) {
PipelineCtx ctx = PipelineCtx.from(request);
// some steps happen here
// ...
BarStep barStep = new BarStep();
barStep.doWork(crx);
// some more steps maybe
// ...
FooStep fooStep = new FooStep();
fooStep.doWork(ctx);
// final steps ...
return BlahResponse.from(ctx);
}
}