نماها را با جاوا، Spring و پایگاه داده استریم جستجو کنید

نماهای متریال شده ابزار قدرتمندی در سیستم های مدیریت پایگاه داده است که به کاربران امکان می دهد نتایج یک پرس و جو را از قبل محاسبه و ذخیره کنند، عملکرد را بهبود می بخشد و نیاز به محاسبات گران قیمت را کاهش می دهد. با این حال، در محیطهای تجاری مدرن و سریع، دادههای پایگاه داده ممکن است به طور مکرر تغییر کنند، که نیاز به بهروزرسانیهای مکرر برای نماهای تحقق یافته دارد. پایگاه داده های جریانی ما را قادر می سازد به طور مداوم بلعیدن و حجم زیادی از داده ها را از منابع داده های مختلف در زمان واقعی پردازش می کند. در این مقاله به بررسی خواهیم پرداخت نحوه پرس و جو نماهای تحقق یافته با جاوا، Spring و پایگاه داده استریم مانند RisingWave.
اهداف یادگیری
در طول مقاله موارد زیر را خواهید آموخت:
- نحوه جذب موضوعات کافکا و اجرای جستارهای بلادرنگ.
- نحوه ایجاد نماهای واقعی با پایگاه داده استریم
- یک برنامه جاوا بسازید که داده ها را از نماهای واقعی می خواند و در معرض دید قرار می دهد.
محتوای پیشنهادی
قبل از ادامه این پست، اکیداً توصیه میکنم پستهای دیگرم را نیز بخوانید تا متوجه شوید که پایگاهدادهای جریانی با یک پایگاه داده سنتی چه تفاوتی دارد، چرا باید از نماهای مادیتشده برای پرسوجو از میکروسرویسها استفاده کنیم، و چگونه دادههای بلادرنگ را در کافکا با استفاده از SQL جستجو کنیم.
سناریوی نمونه: تجزیه و تحلیل عملکرد تحویل سفارش
عملکرد تحویل سفارش یک معیار بسیار مهم برای هر کسب و کاری است که محصولات را به صورت آنلاین می فروشد. این نشان دهنده کارایی و اثربخشی فرآیند انجام سفارش است و به طور مستقیم بر رضایت مشتری تأثیر می گذارد. برای تجزیه و تحلیل عملکرد تحویل سفارش، کسبوکارها باید شاخصهای کلیدی عملکرد (KPI) مانند زمان تحویل، دقت سفارش و هزینه تحویل را ردیابی کنند. در محدوده این مقاله، ما یک نمونه برنامه تحویل سفارش (شما میتوانید کد منبع را در GitHub بیابید) ایجاد میکنیم که با استفاده از جاوا و Spring Boot ساخته شده است و نحوه استفاده از پایگاه داده جریان و نماهای واقعی را برای تجزیه و تحلیل عملکرد تحویل سفارش غذا در زمان واقعی یاد میگیریم.
نمودار معماری زیر که جریان کلی داده را نشان می دهد:
- ما یک موضوع کافکا داریم به نام
delivery_orders
که شامل رویدادهایی برای هر سفارشی است که در یک وب سایت تحویل غذا ارسال می شود. هر رویداد شامل اطلاعات مربوط به سفارش، مانندorder ID
،restaurant ID
، وdelivery status
. مولد بار کاری (اسکریپت پایتون به نام Datagen) تولید دادههای ساختگی تصادفی را به طور مداوم شبیهسازی میکند و آنها را در موضوعات کافکا پخش میکند. در واقع، این داده های ساختگی را می توان با داده های دریافتی از برنامه جایگزین کرد. - پایگاه داده استیمینگ RisingWave به یک کارگزار کافکا متصل می شود و موضوعات کافکا را با استفاده از رابط کافکا می خواند. همچنین داده ها را از منبع در جدول RisingWave نگهداری می کند.
- RisingWave به ما این امکان را می دهد جستجوی جریان داده با استفاده از SQL و ما می توانیم ایجاد دیدگاه های مادی شده که برای پرس و جوهای پیچیده با کاهش نیاز به اتصال و محاسبات گران قیمت بهینه شده اند. داده های ذخیره شده در نمای مادی شده خواهد بود با رسیدن تغییرات جدید به طور خودکار به روز می شود.
- سپس، نمای تحقق یافته را از نمونه Spring boot Web API جستجو می کنیم.
نمایش نمایشی نماهای تحقق یافته را پرس و جو کنید
بیایید فرض کنیم یک نمای واقعی به نام restaurant_orders_view داریم که تعداد کل سفارشهای ایجاد شده از رستورانهای مختلف در 15 دقیقه گذشته را در زمان واقعی محاسبه میکند. اکنون وظیفه ما این است که این نتیجه نمای تحقق یافته را به عنوان یک نقطه پایانی API در یک سرویس سفارش در معرض دید قرار دهیم /orders/count-total-restaurant-orders
. در جاوا، میتوانید با استفاده از JDBC، که یک API جاوا برای اتصال به پایگاههای داده است، نماهای تحققیافته را جستجو کنید. علاوه بر این، میتوانید از Spring Framework برای سادهسازی فرآیند کار با JDBC و ایجاد یک REST API استفاده کنید.
از آنجایی که RisingWave با PostgreSQL سازگار است، می توانید از درایور PostgreSQL JDBC برای اتصال به RisingWave و تعامل با RisingWave از برنامه های جاوا خود استفاده کنید. همچنین می توانید از کتابخانه های دیگر کلاینت ها برای زبان های برنامه نویسی مختلف (NodeJS، Python و Go) استفاده کنید.
بخش های بعدی یک راهنمای گام به گام برای جستجوی یک نمای مادی در جاوا و Spring به شما نشان می دهد.
قبل از اینکه شروع کنی
این آموزش شامل راه اندازی دو پروژه است:
- ما در محیط محلی خود، خوشه نمایشی با ویژگی های کامل RisingWave موجود در GitHub را که از چندین مؤلفه RisingWave تشکیل شده است، باز خواهیم کرد. برای ساده کردن این کار، از فایل docker-compose.yaml استفاده میکند که شامل کانتینرهای اضافی برای کارگزار پیام کافکا و سرویس تولید داده است.
- اپلیکیشن Spring boot، یک پروژه Maven با وابستگی های لازم است و ما آن را به صورت محلی نیز اجرا خواهیم کرد.
برای تکمیل این آموزش به موارد زیر نیاز دارید:
مرحله 1: راه اندازی دمو کلاستر
ابتدا مخزن RisingWave را در محیط محلی خود کلون کنید.
git clone https://github.com/risingwavelabs/risingwave.git
سپس، به مسیر بروید integration_tests/delivery
دایرکتوری و کلاستر دمو را از فایل نوشتن docker شروع کنید.
cd risingwave/integration_tests/delivery
docker compose up -d
مطمئن شوید که همه کانتینرها آماده و کار می کنند!
مرحله 2: برنامه Spring Boot را کپی کرده و باز کنید.
هنگامی که پایگاه داده استریم راه اندازی شد، برنامه Spring Boot خود را اجرا خواهیم کرد. همچنین، پروژه را فورک/کلون کنید و آن را در ویرایشگر جاوا خود باز کنید.
git clone https://github.com/Boburmirzo/risingwave-java-spring.git
مرحله 3: پروژه را نصب کنید.
سپس انجام دهید mvn clean install
از پوشه ریشه پروژه در ماون pom.xml
فایل را اضافه کردیم postgresql
وابستگی و spring-boot-starter-jdbc
وابستگی راننده به پروژه ما این وابستگی ها کلاس ها و رابط های لازم را برای کار با JDBC در بهار فراهم می کنند.
مرحله 4: برنامه دمو RisingWave را اجرا کنید.
اکنون می توانیم DemoRisingWaveApplication.java اصلی خود را از ویرایشگر اجرا کنیم. پس از اجرای برنامه، به نقطه پایانی در پورت دسترسی پیدا می کنید 8080
یا این URL را در مرورگر خود باز کنید. http://localhost:8080/orders/count-total-restaurant-orders. شما پاسخ نمای واقعی را از RisingWave دریافت خواهید کرد.
[["2023-05-06T05:28:00.000+00:00",1,1],["2023-05-06T05:33:00.000+00:00",1,3...]]
تفکیک فایل های پروژه
بیایید چند فایل مهم در پروژه را برای درک هر نقش تجزیه کنیم.
به RisingWave متصل شوید
برای پرس و جو از یک نمای واقعی در برنامه Spring Boot، ابتدا باید با پیکربندی فایل Spring Boot application.yml یک اتصال به پایگاه داده جریان برقرار کنید. را datasource
بخش یک اتصال پایگاه داده PostgreSQL را با URL پایگاه داده RisingWave تنظیم می کند jdbc:postgresql://localhost:4566/dev
(به الف اشاره می کند dev
پایگاه داده در حال اجرا بر روی خوشه آزمایشی RisingWave ما)، یک نام کاربری “root” و یک رمز عبور خالی.
server:
port: 8080
spring:
profiles:
active: dev
application:
name: materialized-view-api
datasource:
url: jdbc:postgresql://localhost:4566/dev
username: root
password:
...
یک منبع داده و نمای مادی ایجاد کنید
در مرحله بعد، در فایل Startup.java، ما سه دستور SQL داریم که هنگام راهاندازی برنامه Spring Boot برای ایجاد منبعی بهعنوان Kafka در RisingWave، رها کردن نماهای واقعی موجود، اجرا میشوند و موارد جدید ایجاد کنید با خواندن این داده ها از فایل view.json در فهرست منابع برنامه که حاوی لیستی از نماهای ساخته شده برای ایجاد است. به عنوان مثال، در زیر یک دستور SQL وجود دارد که جدولی به نام ایجاد می کند delivery_orders_source
در پایگاه داده جریان RisingWave. جدول دارای چهار ستون است: order_id
، restaurant_id
، order_state
، و order_timestamp
.
public static final String CREATE_RISINGWAVE_SOURCE_TABLE = "CREATE TABLE IF NOT EXISTS delivery_orders_source (\n" +
" order_id BIGINT,\n" +
" restaurant_id BIGINT,\n" +
" order_state VARCHAR,\n" +
" order_timestamp TIMESTAMP\n" +
") WITH (\n" +
" connector="kafka",\n" +
" topic="delivery_orders",\n" +
" properties.bootstrap.server="message_queue:29092",\n" +
" scan.startup.mode="earliest"\n" +
") ROW FORMAT JSON;";
این بیانیه همچنین شامل الف WITH
بند که گزینه های اضافی را برای جدول مشخص می کند. در این مورد، connector
گزینه تنظیم شده است kafka
، که نشان می دهد جدول به موضوع کافکا متصل خواهد شد. را topic
گزینه تنظیم شده است delivery_orders
، که نام موضوع کافکا را مشخص می کند.
با JdbcTemplate یک نمای تحقق یافته را جستجو کنید
Spring تعدادی از ویژگی ها را برای کمک به شما در کار با پایگاه های داده فراهم می کند، از جمله JdbcTemplate
کلاس، که فرآیند اجرای دستورات SQL و پردازش نتایج را ساده می کند. برای پرس و جوی یک نمای واقعی در بهار، می توانید از JdbcTemplate
کلاس برای اجرای پرس و جوی SQL که داده ها را از نمای متریال شده انتخاب می کند و سپس داده ها را از مجموعه نتایج استخراج می کند.
String createSql = String
.format(CREATE_MATERIALIZED_VIEW, materializeView.getName(), materializeView.getQuery());
jdbcTemplate.execute(createSql);
یک نمای تحقق یافته را با JPA جستجو کنید
هنگامی که نمای تحقق یافته ایجاد شد، می توان آن را در جاوا با استفاده از مخزن Spring Data JPA نیز جستجو کرد. شما می توانید یک کلاس موجودیت جدید به نام ایجاد کنید RestaurantOrdersView
که به ستون های جدول نمای مادی شده در RisingWave نگاشت می شود.
@Entity
@Getter
@Setter
@Table(name = "restaurant_orders_view")
public class RestaurantOrdersView implements Serializable {
@Id
@Column(name = "restaurant_id")
private Long restaurantId;
@Column(name = "window_start")
private Timestamp windowStart;
@Column(name = "total_order")
private BigInteger totalOrder;
}
با وجود کلاس موجودیت، میتوانیم یک مخزن Spring Data JPA ایجاد کنیم که به ما امکان میدهد با استفاده از روشهای پرسوجو استاندارد JPA یا شما میتوانید از یک پرس و جوی SQL بومی، نمای تحققیافته را پرس و جو کنیم. به عنوان مثال، کد زیر کل سفارش های رستوران را بازیابی می کند:
@Component
public class OrderDeliveryRepositoryImpl implements OrderDeliveryRepository {
@PersistenceContext
private EntityManager entityManager;
@Override
public List<RestaurantOrdersView> countTotalRestaurantOrders() {
Query query = entityManager.createNativeQuery("SELECT * FROM restaurant_orders_view WHERE restaurant_id = 1");
return query.getResultList();
}
}
این روش countTotalRestaurantOrders
سپس می توان از ما تماس گرفت OrderDeliveryService
ما می توانیم منطق تجاری اضافی را اضافه کرده و آن را به آن منتقل کنیم OrderDeliveryController
برای در دسترس قرار دادن این داده ها از طریق نقطه پایانی REST.
@RestController
@RequiredArgsConstructor
@RequestMapping("/orders")
@CrossOrigin(value = "*", allowedHeaders = "*")
public class OrderDeliveryController {
private final OrderDeliveryService orderDeliveryService;
@GetMapping("/count-total-restaurant-orders")
@CrossOrigin(value = "*", allowedHeaders = "*")
public List<RestaurantOrdersView> getCountTotalRestaurantOrders() {
return orderDeliveryService.countTotalRestaurantOrders();
}
}
در نتیجه، با استفاده از یک پایگاه داده جریان ما می توانیم دریافت جریان داده از یک یا چند منبع داده در زمان واقعی، می توانید چندین جریان را ادغام کنید و نماهای واقعی ایجاد کنید. Spring Boot پشتیبانی داخلی برای ادغام با منابع داده محبوبمانند پایگاه داده های جریان. دیدهایم که چگونه کسبوکارها میتوانند عملکرد تحویل سفارش را در زمان واقعی با پایگاهداده استریم، جاوا و Spring تجزیه و تحلیل کنند و آنها را قادر به شناسایی تنگناها و بهبود کارایی و اثربخشی فرآیند انجام سفارش خود کنند.
🙋 به انجمن Risingwave بپیوندید
از وبلاگ من دیدن کنید: www.iambobur.com