ما بخش توسعه فناوری یک شبکه خرده فروشی هستیم. یک روز، مدیریت وظیفه سرعت بخشیدن به محاسبات در مقیاس بزرگ را با استفاده از Apache Ignite در ارتباط با MSSQL تعیین کرد و وب سایتی را با تصاویر زیبا و نمونه هایی از کد جاوا نشان داد. من بلافاصله از سایت خوشم آمد
1. بیان مسئله
اصل مسئله به شرح زیر است. یک فهرست راهنمای نقاط فروش SalesPoint و یک فهرست محصول Sku (واحد نگهداری سهام) وجود دارد. نقطه فروش دارای ویژگی "نوع فروشگاه" با مقادیر "small" و "large" است. مجموعه ای (فهرست محصولات نقطه فروش) به هر نقطه فروش (بارگیری شده از DBMS) متصل می شود و اطلاعاتی ارائه می شود که از تاریخ مشخص شده محصول مشخص شده
از مجموعه حذف شده یا به مجموعه اضافه شده است.
لازم است یک کش پارتیشن بندی شده از نقاط فروش سازماندهی شود و اطلاعات مربوط به محصولات متصل به مدت یک ماه قبل در آن ذخیره شود. سازگاری با سیستم رزمی به گره مشتری Ignite نیاز دارد تا داده ها را بارگیری کند، مجموع فرم (نوع فروشگاه، کد محصول، روز، تعداد_نقاط_فروش) را محاسبه کند و آن را دوباره به DBMS آپلود کند.
2. مطالعه ادبیات
من هنوز هیچ تجربه ای ندارم، بنابراین از روی اجاق شروع به رقصیدن می کنم. یعنی از بررسی نشریات.
ماده 2016
خوش بینانه قول می دهد "در یک لحظه آماده خواهید شد!" من در حال کشف تنظیمات متغیر محیطی هستم، دو ویدیوی Apache Ignite Essentials را تماشا می کنم، اما آنها برای کار خاص من چندان مفید نبودند. من با موفقیت Ignite را از خط فرمان با فایل استاندارد "example-ignite.xml" راه اندازی کردم و اولین برنامه را ساختم.
من بیشتر مطالعه کردم و در آنجا مثال بلافاصله از affinityKey (که قبلاً از طریق یک پرس و جوی SQL ایجاد شده بود) استفاده می کند و حتی از BinaryObject مرموز استفاده می کند:
IgniteCache<BinaryObject, BinaryObject> people
= ignite.cache("Person").withKeepBinary();
خواندن
من در حال بازسازی برنامه Compute Application هستم تا مناسب مورد من باشد. کلید اصلی دایرکتوری نقاط فروش در MSSQL به صورت [id] [int] NOT NULL تعریف شده است، من یک کش با قیاس ایجاد می کنم.
IgniteCache<Integer, SalesPoint> salesPointCache=ignite.cache("spCache")
در پیکربندی xml نشان میدهم که کش پارتیشن بندی شده است
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="spCache"/>
<property name="cacheMode" value="PARTITIONED"/>
</bean>
پارتیشن بندی بر اساس نقطه فروش فرض می کند که جمع مورد نیاز روی هر گره خوشه ای برای رکوردهای salesPointCache موجود در آنجا ساخته می شود، پس از آن گره مشتری جمع بندی نهایی را انجام می دهد.
دارم آموزش رو میخونم
@Override
public void run() {
SalesPoint sp=salesPointCache.get(spId);
sp.calculateSalesPointCount();
..
}
من منطق تجمیع و آپلود را اضافه می کنم و آن را روی یک مجموعه داده آزمایشی اجرا می کنم. همه چیز به صورت محلی روی سرور توسعه کار می کند.
من دو سرور آزمایشی CentOs را راهاندازی میکنم، آدرسهای IP را در default-config.xml مشخص میکنم، روی هر کدام اجرا میکنم.
./bin/ignite.sh config/default-config.xml
هر دو گره Ignite در حال اجرا هستند و می توانند یکدیگر را ببینند. من آدرس های مورد نیاز را در پیکربندی xml برنامه مشتری مشخص می کنم، شروع می شود، یک گره سوم به توپولوژی اضافه می کند و بلافاصله دوباره دو گره وجود دارد. گزارش "ClassNotFoundException: model.SalesPoint" را در خط نشان می دهد
SalesPoint sp=salesPointCache.get(spId);
StackOverflow می گوید که دلیل این خطا این است که کلاس SalesPoint سفارشی در سرورهای CentOs وجود ندارد. ما رسیدیم در مورد "شما لازم نیست کد جاوا خود را به صورت دستی در هر گره مستقر کنید" و غیره چطور؟ یا «کد جاوای شما» مربوط به SalesPoint نیست؟
احتمالاً چیزی را از دست داده ام - دوباره شروع به جستجو می کنم، دوباره می خوانم و دوباره جستجو می کنم. بعد از مدتی احساس می کنم که همه چیز را در مورد موضوع خوانده ام، دیگر چیز جدیدی وجود ندارد. در حین جستجو، نظرات جالبی پیدا کردم.
Model classes are not peer deployed, but you can use withKeepBinary() flag
on the cache and query BinaryObjects. This way you will avoid deserialization
on the server side and will not get ClassNotFoundException.
نظر معتبر دیگر:
مقاله در Habré
That's it. Start (..) node using MaintenanceServiceNodeStartup file or pass
maintenance-service-node-config.xml to Apache Ignite's ignite.sh/bat scripts.
If you prefer the latter then make sure to build a jar file that will contain
all the classes from java/app/common and java/services/maintenance directories.
The jar has to be added to the classpath of every node where the service
might be deployed.
در واقع همین است. در اینجا معلوم می شود، چرا، این فرمت باینری مرموز!
3.SingleJar
دنیس رتبه اول را در رتبه بندی شخصی من کسب کرد، IMHO مفیدترین آموزش در دسترس است. در او
من این کار را به همین ترتیب انجام می دهم و یک فایل jar دریافت می کنم که بسته به آرگومان خط فرمان، "گره داده" یا "گره مشتری" را راه اندازی می کند. مونتاژ شروع می شود و کار می کند. Zero Deployment شکست خورده است.
انتقال از مگابایت داده های آزمایشی به ده ها گیگابایت داده رزمی نشان داد که فرمت باینری به دلایلی وجود دارد. لازم بود مصرف حافظه در گره ها بهینه شود، و اینجاست که باینری اوبجکت بسیار مفید بود.
4. نتیجه گیری
اولین سرزنش در مورد مبهم بودن مستندات پروژه Apache Ignite منصفانه بود؛ از سال 2016 کمی تغییر کرده است. برای یک مبتدی آسان نیست که یک نمونه اولیه کارآمد را بر اساس یک وب سایت و/یا مخزن جمع آوری کند.
بر اساس نتایج کار انجام شده، تصور این بود که Zero Deployment کار می کند، اما فقط در سطح سیستم. چیزی شبیه به این: BinaryObject برای آموزش گره های خوشه راه دور برای کار با کلاس های سفارشی استفاده می شود. استقرار صفر - مکانیزم داخلی
Apache Ignite خودش است و اشیاء سیستم را در سراسر خوشه توزیع می کند.
امیدوارم تجربه من برای کاربران جدید Apache Ignite مفید باشد.
منبع: www.habr.com