Lietuvių

Naršykite fono darbų ir eilės apdorojimo pasaulį: supraskite naudą, diegimą, populiarias technologijas ir geriausias praktikas kuriant plečiamas ir patikimas sistemas.

Fono darbai: Išsamus vadovas po eilės apdorojimo

Šiuolaikinėje programinės įrangos kūrimo aplinkoje tikimasi, kad programos apdoros vis didėjančius duomenų kiekius ir vartotojų užklausas. Kiekvienos užduoties atlikimas sinchroniškai gali lemti lėtus atsakymų laikus ir prastą vartotojo patirtį. Štai čia ir atsiranda fono darbai bei eilės apdorojimas. Jie leidžia programoms perkelti laiko reikalaujančias ar išteklių intensyvias užduotis, kad jos būtų apdorojamos asinchroniškai, atlaisvinant pagrindinį programos giją ir pagerinant bendrą našumą bei reagavimą.

Kas yra fono darbai?

Fono darbai yra užduotys, kurios vykdomos nepriklausomai nuo pagrindinio programos srauto. Jos veikia fone, neužblokuodamos vartotojo sąsajos ir netrukdydamos vartotojo patirties. Šios užduotys gali apimti:

Deleguodamos šias užduotis fono darbams, programos gali išlikti jautrios ir apdoroti didesnį vienalaikių vartotojų skaičių. Tai ypač svarbu žiniatinklio programoms, mobiliosioms programėlėms ir paskirstytoms sistemoms.

Kodėl naudoti eilių apdorojimą?

Eilių apdorojimas yra pagrindinis fono darbų vykdymo komponentas. Tai apima pranešimų eilės naudojimą fono darbams saugoti ir valdyti. Pranešimų eilė veikia kaip buferis tarp programos ir darbuotojų procesų, kurie vykdo darbus. Štai kodėl eilių apdorojimas yra naudingas:

Pagrindiniai eilės apdorojimo sistemos komponentai

Tipinę eilių apdorojimo sistemą sudaro šie komponentai:

Gamintojas prideda darbus į eilę. Pranešimų eilė saugo darbus, kol darbuotojo procesas bus pasirengęs juos apdoroti. Darbuotojo procesas gauna darbą iš eilės, jį vykdo ir tada patvirtina, kad darbas buvo baigtas. Tada eilė pašalina darbą iš eilės. Jei darbuotojas negali apdoroti darbo, eilė gali bandyti pakartoti darbą arba perkelti jį į „negautų“ eilę.

Populiarios pranešimų eilės technologijos

Yra keletas pranešimų eilės technologijų, kiekviena su savo stiprybėmis ir trūkumais. Štai keletas populiariausių variantų:

RabbitMQ

RabbitMQ yra plačiai naudojamas atviro kodo pranešimų tarpininkas, palaikantis kelis pranešimų protokolus. Jis žinomas dėl savo patikimumo, plečiamumo ir lankstumo. RabbitMQ yra geras pasirinkimas programoms, kurioms reikia sudėtingų maršrutizavimo ir pranešimų modelių. Jis yra pagrįstas AMQP (Advanced Message Queuing Protocol) standartu.

Naudojimo atvejai:

Kafka

Kafka yra paskirstytosios srautinio perdavimo platforma, skirta didelio našumo, realaus laiko duomenų tiekimui. Ji dažnai naudojama kuriant duomenų tiekimo grandines ir srautinio perdavimo analitikos programas. Kafka žinoma dėl savo plečiamumo, atsparumo gedimams ir gebėjimo apdoroti didelius duomenų kiekius. Skirtingai nei RabbitMQ, Kafka saugo pranešimus tam tikrą nustatytą laiką, leisdama vartotojams pakartoti pranešimus, jei reikia.

Naudojimo atvejai:

Redis

Redis yra atminties duomenų struktūrų saugykla, kuri taip pat gali būti naudojama kaip pranešimų tarpininkas. Jis žinomas dėl savo greičio ir paprastumo. Redis yra geras pasirinkimas programoms, kurioms reikia mažo delsos ir didelio našumo. Tačiau Redis nėra toks patvarus kaip RabbitMQ ar Kafka, nes duomenys saugomi atmintyje. Yra galimybių išsaugoti duomenis, tačiau jos gali paveikti našumą.

Naudojimo atvejai:

AWS SQS (Simple Queue Service)

AWS SQS yra „Amazon Web Services“ siūloma visiškai valdoma pranešimų eilės paslauga. Tai plečiama ir patikima galimybė kurti paskirstytas programas debesyje. SQS siūlo dviejų tipų eilės: standartines ir FIFO (pirmas įvestas, pirmas išvestas).

Naudojimo atvejai:

Google Cloud Pub/Sub

Google Cloud Pub/Sub yra „Google Cloud Platform“ siūloma visiškai valdoma, realaus laiko pranešimų paslauga. Ji leidžia siųsti ir gauti pranešimus tarp nepriklausomų programų ir sistemų. Ji palaiko tiek stumiamojo, tiek traukiamojo pristatymo modelius.

Naudojimo atvejai:

Azure Queue Storage

Azure Queue Storage yra „Microsoft Azure“ teikiama paslauga dideliam kiekiui pranešimų saugoti. Galite naudoti Queue Storage, kad asinchroniškai bendrautumėte tarp programos komponentų.

Naudojimo atvejai:

Fono darbų diegimas: Praktiniai pavyzdžiai

Panagrinėkime kelis praktinius fono darbų diegimo pavyzdžius naudojant skirtingas technologijas.

1 pavyzdys: El. pašto pranešimų siuntimas naudojant Celery ir RabbitMQ (Python)

Celery yra populiari Python biblioteka asinchroninėms užduočių eilėms. Ji gali būti naudojama su RabbitMQ kaip pranešimų tarpininku. Šis pavyzdys parodo, kaip siųsti el. pašto pranešimus naudojant Celery ir RabbitMQ.

# celeryconfig.py
broker_url = 'amqp://guest:guest@localhost//'
result_backend = 'redis://localhost:6379/0'

# tasks.py
from celery import Celery
import time

app = Celery('tasks', broker='amqp://guest:guest@localhost//', backend='redis://localhost:6379/0')

@app.task
def send_email(email_address, subject, message):
 time.sleep(10) # Simulate sending email
 print(f"Sent email to {email_address} with subject '{subject}' and message '{message}'")
 return f"Email sent to {email_address}"

# app.py
from tasks import send_email

result = send_email.delay('test@example.com', 'Hello', 'This is a test email.')
print(f"Task ID: {result.id}")

Šiame pavyzdyje funkcija send_email yra dekoruota su @app.task, kuri nurodo Celery, kad tai yra užduotis, kuri gali būti vykdoma asinchroniškai. send_email.delay() funkcijos iškvietimas prideda užduotį į RabbitMQ eilę. Celery darbuotojai tada pasiima užduotis iš eilės ir jas vykdo.

2 pavyzdys: Vaizdų apdorojimas naudojant Kafka ir pasirinktinį darbuotoją (Java)

Šis pavyzdys parodo, kaip apdoroti vaizdus naudojant Kafka kaip pranešimų eilę ir pasirinktinį Java darbuotoją.

# Kafka Producer (Java)
import org.apache.kafka.clients.producer.*;
import java.util.Properties;

public class ImageProducer {
 public static void main(String[] args) throws Exception {
 Properties props = new Properties();
 props.put("bootstrap.servers", "localhost:9092");
 props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
 props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

 Producer<String, String> producer = new KafkaProducer<>(props);
 for (int i = 0; i < 10; i++) {
 producer.send(new ProducerRecord<>("image-processing", Integer.toString(i), "image_" + i + ".jpg"));
 System.out.println("Message sent successfully");
 }
 producer.close();
 }
}

# Kafka Consumer (Java)
import org.apache.kafka.clients.consumer.*;
import java.util.Properties;
import java.util.Arrays;

public class ImageConsumer {
 public static void main(String[] args) throws Exception {
 Properties props = new Properties();
 props.setProperty("bootstrap.servers", "localhost:9092");
 props.setProperty("group.id", "image-processor");
 props.setProperty("enable.auto.commit", "true");
 props.setProperty("auto.commit.interval.ms", "1000");
 props.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
 props.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
 Consumer<String, String> consumer = new KafkaConsumer<>(props);
 consumer.subscribe(Arrays.asList("image-processing"));
 while (true) {
 ConsumerRecords<String, String> records = consumer.poll(100);
 for (ConsumerRecord<String, String> record : records) {
 System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
 // Simulate image processing
 System.out.println("Processing image: " + record.value());
 Thread.sleep(2000);
 System.out.println("Image processed successfully");
 }
 }
 }
}

Gamintojas siunčia vaizdo failų pavadinimus į Kafka temą „image-processing“. Vartotojas prisijungia prie šios temos ir apdoroja atvykusius vaizdus. Šis pavyzdys parodo paprastą vaizdų apdorojimo grandinę naudojant Kafka.

3 pavyzdys: Planuojami darbai naudojant AWS SQS ir Lambda (be serverio)

Šis pavyzdys parodo, kaip planuoti darbus naudojant AWS SQS ir Lambda funkcijas. AWS CloudWatch Events gali būti naudojama Lambda funkcijai paleisti nustatytu laiku ar intervalu. Tada Lambda funkcija prideda darbą į SQS eilę. Kita Lambda funkcija veikia kaip darbuotojas, apdorodamas darbus iš eilės.

1 žingsnis: Sukurkite SQS eilę

Sukurkite SQS eilę AWS valdymo konsoleje. Užsirašykite eilės ARN (Amazon Resource Name).

2 žingsnis: Sukurkite Lambda funkciją (Planuoklis)

# Lambda function (Python)
import boto3
import json
import datetime

sqs = boto3.client('sqs')
QUEUE_URL = 'YOUR_SQS_QUEUE_URL'  # Replace with your SQS queue URL

def lambda_handler(event, context):
 message = {
 'task': 'Generate Report',
 'timestamp': str(datetime.datetime.now())
 }

 response = sqs.send_message(
 QueueUrl=QUEUE_URL,
 MessageBody=json.dumps(message)
 )

 print(f"Message sent to SQS: {response['MessageId']}")
 return {
 'statusCode': 200,
 'body': 'Message sent to SQS'
 }

3 žingsnis: Sukurkite Lambda funkciją (Darbuotojas)

# Lambda function (Python)
import boto3
import json
import time

sqs = boto3.client('sqs')
QUEUE_URL = 'YOUR_SQS_QUEUE_URL'  # Replace with your SQS queue URL

def lambda_handler(event, context):
 for record in event['Records']:
 body = json.loads(record['body'])
 print(f"Received message: {body}")
 # Simulate report generation
 print("Generating report...")
 # time.sleep(5)
 print("Report generated successfully.")

 return {
 'statusCode': 200,
 'body': 'Message processed'
 }

4 žingsnis: Sukurkite CloudWatch Events taisyklę

Sukurkite CloudWatch Events taisyklę, kad paleistumėte planuoklio Lambda funkciją nustatytu laiku ar intervalu. Nustatykite taisyklę, kad ji paleistų Lambda funkciją.

5 žingsnis: Konfigūruokite SQS paleidiklį darbuotojo Lambda funkcijai

Pridėkite SQS paleidiklį darbuotojo Lambda funkcijai. Tai automatiškai paleis darbuotojo Lambda funkciją, kai į SQS eilę bus pridėta nauja žinutė.

Šis pavyzdys demonstruoja serverio technologiją planavimo ir fono užduočių apdorojimui naudojant AWS paslaugas.

Geriausios eilės apdorojimo praktikos

Norėdami sukurti tvirtas ir patikimas eilių apdorojimo sistemas, apsvarstykite šias geriausias praktikas:

Naudojimo atvejai įvairiose pramonės šakose

Eilių apdorojimas naudojamas įvairiose pramonės šakose ir programose. Štai keletas pavyzdžių:

Eilių apdorojimo ateitis

Eilių apdorojimas yra besivystanti sritis. Kylančios tendencijos apima:

Išvada

Fono darbai ir eilių apdorojimas yra esminiai metodai kuriant plečiamas, patikimas ir jautrias programas. Suprasdami pagrindines sąvokas, technologijas ir geriausias praktikas, galite suprojektuoti ir įdiegti eilių apdorojimo sistemas, kurios atitinka jūsų programų specifinius poreikius. Nesvarbu, ar kuriate mažą žiniatinklio programą, ar didelę paskirstytą sistemą, eilių apdorojimas gali padėti jums pagerinti našumą, padidinti patikimumą ir supaprastinti jūsų architektūrą. Atminkite, kad pasirinktumėte tinkamą pranešimų eilės technologiją savo poreikiams ir laikykitės geriausių praktikų, kad užtikrintumėte, jog jūsų eilių apdorojimo sistema būtų tvirta ir efektyvi.