۳۰ آذر ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

عملی با MicroStream: رویکردی جدید برای ماندگاری جاوا

MicroStream لایه ماندگاری جاوا را انتزاعی می کند تا بتوانید در مورد ماندگاری داده به روشی شی گرا فکر کنید. در اینجا یک معرفی عملی است.

MicroStream لایه ماندگاری جاوا را انتزاعی می کند تا بتوانید در مورد ماندگاری داده به روشی شی گرا فکر کنید. در اینجا یک معرفی عملی است.

MicroStream یکی از جالب‌ترین پروژه‌ها در حال حاضر در فضای جاوا است. این یک رویکرد تازه به ماندگاری جاوا دارد و به عنوان نوعی لایه داده پایدار شیء بدون درز عمل می کند. MicroStream اصطکاک مربوط به چگونگی تداوم گراف زمان اجرا برنامه را از بین می برد. من MicroStream را در مقاله قبلی معرفی کرده ام، بنابراین این بار مستقیماً وارد یک نمایش می شویم. ابتدا نحوه استفاده از MicroStream با یک سیستم فایل پیش‌فرض را خواهید آموخت، سپس ما برنامه آزمایشی خود را برای استفاده از MariaDB RDBMS به‌روزرسانی می‌کنیم.

یک پروژه جاوا راه اندازی کنید

بیایید با ایجاد یک پروژه جدید جاوا شروع کنیم. ما از یک پروژه ساده Maven استفاده خواهیم کرد، اما هر رویکردی کار می کند. خط فرمان خود را باز کنید و کد را در لیست ۱ وارد کنید تا یک پروژه جدید با کهن الگوی Maven ایجاد کنید.


$ mvn archetype:generate -DgroupId=com.infoworld -DartifactId=microstream -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -Dpackage=com.infoworld -DinteractiveMode=false

توجه داشته باشید که من شناسه گروه را به عنوان com.infoworld، شناسه پروژه را به عنوان microstream و بسته را به عنوان com.infoworld.

در مرحله بعد، فایل /myproject/pom.xml را باز کنید و وابستگی نشان داده شده در فهرست ۲ را اضافه کنید. ما از کتابخانه ذخیره سازی جاسازی شده MicroStream استفاده خواهیم کرد که ساده ترین روش است. همچنین مطمئن شوید که نسخه کامپایلر Maven روی ۱.۸ تنظیم شده است.


<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
<!-- ... -->
<dependency>
    <groupId>one.microstream</groupId>
    <artifactId>microstream-storage-embedded</artifactId>
    <version>07.01.00-MS-GA</version>
</dependency>

اکنون می‌توانیم پروژه راه‌اندازی MicroStream را اجرا کنیم و همانطور که در فهرست ۳ نشان داده شده است، از خط فرمان پاسخی دریافت کنیم.


$ mvn clean package
$ java -cp target/microstream-1.0-SNAPSHOT.jar com.infoworld.App
Hello World!

یک مدل برای ماندگاری اضافه کنید

بعد، بیایید یک مدل ساده را بگنجانیم که بتوانیم آن را ادامه دهیم. کلاس اصلی پروژه شروع کننده را تغییر می دهیم تا سه آرگومان خط فرمان String گرفته و آن را در ArrayList نگه داریم.


package com.infoworld;

import java.util.ArrayList;

public class App {
  public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<String>();

    for (int i = 0; i < args.length; i++) {
        list.add(args[i]);
    }

    System.out.println(list);
  }
}

می‌توانیم نسخه فهرست آرایه را همانطور که در فهرست ۵ نشان داده شده است آزمایش کنیم. آرگومان‌های پاس شده را می‌گیرد و آنها را در یک List قرار می‌دهد، سپس آن را خروجی می‌دهد.


$ mvn clean package
$ java -cp target/microstream-1.0-SNAPSHOT.jar com.infoworld.App test test2 test3
[test, test2, test3]

ذخیره لیست با MicroStream

اکنون، این کد را تغییر دهید تا لیست با MicroStream ذخیره شود. فهرست ۶ نحوه انجام آن را نشان می دهد.


package com.infoworld;

import java.util.ArrayList;

public class App {
  public static void main(String[] args) {
    ArrayList<String> list;
      if (args.length > 0) {
        list = new ArrayList<String>();
        for (int i = 0; i < args.length; i++) {
          list.add(args[i]);
        }
      EmbeddedStorageManager manager = EmbeddedStorage.start();
      manager.setRoot(list);
      manager.storeRoot();
      System.out.println("Saved: " + list);
  }
}

توجه کنید که ذخیره وضعیت با پیش‌فرض‌ها چقدر آسان است. هنگامی که EmbeddedStorage.start() را بدون آرگومان فراخوانی می کنیم، یک موتور MicroStream جدید با پیش فرض ها، از جمله مکان ذخیره سازی فایل پیش فرض و استراتژی پایداری ایجاد می کند.

سپس شی root را با manager.setRoot() در لیست خود قرار می دهیم. هر برنامه MicroStream دارای یک شی ریشه است که ریشه کل گراف شی است که باید حفظ شود.

manager.storeRoot() به موتور می‌گوید که وضعیت را حفظ کند.

فهرست ۷ یک نسخه کامل از برنامه را نشان می دهد. توجه داشته باشید که این لیست در صورت تصویب در لیست باقی می ماند. اگر نه، آن را بازیابی و نمایش می دهد.


import one.microstream.storage.embedded.types.EmbeddedStorage;
import one.microstream.storage.embedded.types.EmbeddedStorageManager;

import java.nio.file.Paths;
import java.util.ArrayList;

public class App {
  public static void main(String[] args) {
    ArrayList<String> list;
    if (args.length > 0) {
      list = new ArrayList<String>();
      for (int i = 0; i < args.length; i++) {
        list.add(args[i]);
      }
      EmbeddedStorageManager manager = EmbeddedStorage.start();
      manager.setRoot(list);
      manager.storeRoot();
      System.out.println("Saved: " + list);
    } else {
      EmbeddedStorageManager storageEngine = EmbeddedStorage.start();
      list = (ArrayList<String>) storageEngine.root();
      System.out.println("Loaded: " + list);
    }
    System.exit(0);
  }
}

می‌بینید که اگر برنامه را با آرگومان اجرا کنید، لیست رشته‌ها را ذخیره می‌کند و اگر آن را بدون آرگ اجرا کنید، آن‌ها را از حافظه خارج کرده و نمایش می‌دهد. لیست ۸ هر دو گزینه را دارد.


$ mvn clean package exec:java -Dexec.mainClass="com.infoworld.App" -Dexec.args="test test2 test3
Saved: [test, test2, test3]
$ mvn clean package exec:java -Dexec.mainClass="com.infoworld.App"
Loaded: [test, test2, test3]

ممکن است تعجب کنید که MicroStream فایل های ذخیره سازی را در کجا قرار می دهد. به طور پیش فرض، از فهرست کاری پروژه جاوا استفاده می کند. . در نسخه ی نمایشی ما، آن را در /microstream/microstream، ریشه پروژه قرار می دهد. اگر به آنجا نگاه کنید، یک /my-storage-folder خواهید دید.

اگر نیاز به تغییر مکان فایل‌های ذخیره‌سازی دارید، می‌توانید آن را با آرگومان start() پیکربندی کنید، مانند آنچه در فهرست ۹ نشان داده شده است. در اینجا، ما یک مکان فایل را در هر دو تنظیم می‌کنیم. شروع به تماس توجه داشته باشید که کتابخانه استاندارد Paths Java را برای مدیریت [چه؟] وارد می‌کنیم.


import java.nio.file.Paths;
//...
EmbeddedStorageManager manager = EmbeddedStorage.start(Paths.get(System.getProperty("user.home"), "data"));

MicroStream با MariaDB

اکنون بیایید نحوه استفاده از یک سیستم ذخیره سازی جایگزین را ببینیم. ما استفاده از نمونه محلی MariaDB را بررسی خواهیم کرد. در مورد من (در اوبونتو) من MariaDB را به عنوان نصب کردم یک سرویس به صورت محلی (به دستورالعمل ها مراجعه کنید). هنگامی که MariaDB را اجرا کردید، می‌توانیم برنامه خود را طوری تغییر دهیم که از پایگاه داده برای نگهداری وضعیت استفاده کند، همانطور که در لیست ۱۰ نشان داده شده است.


package com.infoworld;

import org.mariadb.jdbc.MariaDbDataSource;
import one.microstream.afs.sql.types.SqlFileSystem;
import one.microstream.afs.sql.types.SqlConnector;
import one.microstream.afs.sql.types.SqlProviderMariaDb;
import one.microstream.storage.embedded.types.EmbeddedStorage;
import one.microstream.storage.embedded.types.EmbeddedStorageManager;
import java.util.ArrayList;

public class App {
  public static void main(String[] args) {
    try {
        MariaDbDataSource dataSource = new MariaDbDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUser("admin");
        dataSource.setPassword("password");
        SqlFileSystem fileSystem = SqlFileSystem.New(SqlConnector.Caching(SqlProviderMariaDb.New(dataSource)));

        EmbeddedStorageManager manager = EmbeddedStorage.start(fileSystem.ensureDirectoryPath("microstream_storage"));

        ArrayList<String> list;
        if (args.length > 0) {
          list = new ArrayList<String>();
          for (int i = 0; i < args.length; i++) {
            list.add(args[i]);
          }
          manager.setRoot(list);
          manager.storeRoot();
          System.out.println("Saved: " + list);
        } else {
          list = (ArrayList<String>) manager.root();
          System.out.println("Loaded: " + list);
        }
    } catch (Exception e){
      System.err.println("error: "+ e);
      throw new RuntimeException(e);
    }
  }
}

لیست ۱۰ دارای نسخه کامل برنامه با استفاده از نمونه محلی MariaDB به جای سیستم فایل پیش فرض است. این نسخه فرض می‌کند که MariaDB در پورت لوکال هاست ۳۳۰۶ گوش می‌دهد. رمز عبور کاربر مدیر “رمز عبور” است.

به خطی که در آن EmbeddedStorage.start() فراخوانی می شود توجه کنید. آرگومان fileSystem.ensureDirectoryPath("microstream_storage") ارسال می شود. اثر این است که جدول microstream_storage را به پایگاه داده mydb اضافه کنید، اگر قبلاً وجود ندارد.

اتفاقاً، رسیدگی به خطا در اینجا فقط یک نشانه است. در یک برنامه واقعی، ما باید در مورد رسیدگی به خطاها وجدان بیشتری داشته باشیم.

“afs” در بسته one.microstream.afs.sql مخفف Abstract File System است. هدف این است که به برنامه اجازه دهیم از MicroStream برای ذخیره نمودار شی استفاده کند، بدون اینکه نگران نحوه پیاده سازی آن باشیم. بنابراین یک پایگاه داده، سیستم فایل یا ذخیره‌سازی اشیاء ابری مانند AWS S3 می‌تواند به همان روشی که ما از MariaDB استفاده می‌کنیم، استفاده شود، به جز نحوه پیکربندی فضای ذخیره‌سازی. NoSQL، مانند MongoDB، نیز پشتیبانی می شود، اگرچه یک ویژگی سازمانی است.

برای اجرای این مثال، باید درایور MariaDB و فایل JAR one.microstream.afs را به وابستگی‌های pom.xml اضافه کنیم:


<dependency>
      <groupId>org.mariadb.jdbc</groupId>
      <artifactId>mariadb-java-client</artifactId>
      <version>2.7.1</version>
    </dependency>
 <dependency>
        <groupId>one.microstream</groupId>
        <artifactId>microstream-afs-sql</artifactId>
        <version>07.01.00-MS-GA</version>
</dependency>

اکنون برنامه را می‌توان با همان دستوراتی که در فهرست ۸ مشاهده می‌شود، اجرا کرد، در حالی که وضعیت در نمونه محلی MariaDB باقی می‌ماند.

نتیجه گیری

MicroStream به ماندگاری جاوا به روشی متفاوت از آنچه اکثر توسعه دهندگان جاوا از نظر معماری استفاده می کنند، می پردازد. این نیاز به داشتن یک جزء مستقل جداگانه را که برای مقابله با ذخیره سازی داده ها نصب و نگهداری می شود، حذف می کند. با این حال، دیدید، در صورت تمایل همچنان می توانید از RDBMS استفاده کنید.

MicroStream چیزی شبیه یک ORM (مانند Hibernate) است اما حتی یکپارچه‌تر. امکان تفکر در مورد تداوم داده ها در قلمرو ذهنی اشیا را باز می کند. شما هنوز باید در نظر بگیرید چه چیزی و چه زمانی ذخیره یا بارگیری شود، اما لازم نیست مدل کسب و کار را کنار بگذارید و به عنوان یک مرحله مجزا وارد لایه داده شوید.

MicroStream رویکرد جدیدی به ماندگاری جاوا دارد که می‌تواند یک ویژگی کلیدی در رنسانس جاوا باشد.