Skip to content
ეს გვერდი შეიქმნა და ითარგმნა ხელოვნური ინტელექტის დახმარებით. თუ შეამჩნევთ უზუსტობას, გთხოვთ, დაგვეხმარეთ გაუმჯობესებაში. GitHub-ზე რედაქტირება

მოვლენათა ავტობუსი

PRX მოვლენათა ავტობუსი დანამატებსა და ჰოსტ სისტემას შორის კომუნიკაციას თემაზე დაფუძნებული გამოქვეყნება/გამოწერის მექანიზმით უზრუნველყოფს. დანამატებს შეუძლიათ მოვლენების გამოქვეყნება, თემებზე გამოწერა და სიცოცხლის ციკლის მოვლენებზე რეაგირება -- ყველაფერი კომპონენტებს შორის პირდაპირი კავშირის გარეშე.

მიმოხილვა

მოვლენათა ავტობუსი უზრუნველყოფს:

  • თემაზე დაფუძნებული მარშრუტირება -- მოვლენები იერარქიულ თემებზე ქვეყნდება და შესაბამის გამომწერებს მიეწოდება
  • სიმბოლოანი გამოწერები -- თემის მთლიანი ქვეხეების გამოწერა glob-სტილის შაბლონებით
  • დატვირთვის ლიმიტები -- მაქსიმუმ 64 KB მოვლენის დატვირთვაზე რესურსების ბოროტად გამოყენების თავიდან ასაცილებლად
  • რეკურსიის დაცვა -- მოვლენით-გამოწვეული-მოვლენის მაქსიმუმ 8 დონის სიღრმე უსასრულო ციკლების თავიდან ასაცილებლად
  • არა-უმეტეს-ერთხელ მიწოდება -- მოვლენები გამომწერებს მიეწოდება პერსისტენციისა და ხელახალი ცდის გარეშე

თემის სტრუქტურა

თემები იერარქიულ, წერტილით გამოყოფილ სახელდებას მიჰყვება prx. სახელთა სივრცის ქვეშ:

prx.<კატეგორია>.<მოვლენა>

ჩაშენებული თემები

თემაგამომქვეყნებელიაღწერა
prx.lifecycle.startedჰოსტიPRX დაიწყო და ყველა კომპონენტი ინიციალიზებულია
prx.lifecycle.stoppingჰოსტიPRX ითიშება; დანამატებმა გასუფთავება უნდა მოახდინონ
prx.lifecycle.config_reloadedჰოსტიკონფიგურაცია ცხელ რეჟიმში ხელახლა ჩაიტვირთა
prx.session.createdჰოსტიახალი აგენტის სესია შეიქმნა
prx.session.terminatedჰოსტიაგენტის სესია შეწყდა
prx.session.messageჰოსტიშეტყობინება გაიგზავნა ან მიიღეს სესიაში
prx.channel.connectedჰოსტიარხმა კავშირი დაამყარა
prx.channel.disconnectedჰოსტიარხმა კავშირი დაკარგა
prx.channel.errorჰოსტიარხმა შეცდომა წააწყდა
prx.tool.before_executeჰოსტიინსტრუმენტი შესრულების წინ დგას (ინტერცეპტირებადია)
prx.tool.after_executeჰოსტიინსტრუმენტის შესრულება დასრულდა
prx.plugin.loadedჰოსტიდანამატი ჩაიტვირთა
prx.plugin.unloadedჰოსტიდანამატი ამოიტვირთა
prx.evolution.proposedჰოსტითვით-ევოლუციის წინადადება წარმოიქმნა
prx.evolution.appliedჰოსტითვით-ევოლუციის ცვლილება გამოყენებულ იქნა
prx.evolution.rolled_backჰოსტითვით-ევოლუციის ცვლილება უკუქცეულ იქნა
prx.memory.storedჰოსტიმეხსიერების ჩანაწერი შეინახა
prx.memory.recalledჰოსტიმეხსიერებები კონტექსტისთვის გახსენდა
prx.cron.tickჰოსტიcron პულსი მოხდა

მორგებული თემები

დანამატებს შეუძლიათ საკუთარი სახელთა სივრცის ქვეშ მორგებულ თემებზე გამოქვეყნება:

prx.plugin.<plugin_name>.<event>

მაგალითად, ამინდის დანამატმა შეიძლება გამოაქვეყნოს:

prx.plugin.weather.forecast_updated
prx.plugin.weather.alert_issued

გამოწერის შაბლონები

ზუსტი დამთხვევა

ერთ კონკრეტულ თემაზე გამოწერა:

rust
event_bus.subscribe("prx.session.created", handler);

სიმბოლოანი დამთხვევა

ქვეხის ყველა თემაზე გამოწერა * (ერთ დონე) ან ** (მრავალ დონე) გამოყენებით:

rust
// ყველა სესიის მოვლენა
event_bus.subscribe("prx.session.*", handler);

// ყველა სიცოცხლის ციკლის მოვლენა
event_bus.subscribe("prx.lifecycle.*", handler);

// კონკრეტული დანამატის ყველა მოვლენა
event_bus.subscribe("prx.plugin.weather.*", handler);

// ყველა მოვლენა (ეკონომიურად გამოიყენეთ)
event_bus.subscribe("prx.**", handler);
შაბლონიემთხვევაარ ემთხვევა
prx.session.*prx.session.created, prx.session.terminatedprx.session.message.sent
prx.session.**prx.session.created, prx.session.message.sentprx.channel.connected
prx.*.connectedprx.channel.connectedprx.channel.error
prx.**ყველაფერი prx.-ის ქვეშprx. სახელთა სივრცის გარეთ თემები

მოვლენის სტრუქტურა

ყოველი მოვლენა შეიცავს:

ველიტიპიაღწერა
topicStringთემის სრული ბილიკი (მაგ., prx.session.created)
payloadVec<u8>სერიალიზებული მოვლენის მონაცემები (კონვენციით JSON, მაქს. 64 KB)
sourceStringგამომქვეყნებლის იდენტობა (მაგ., host, plugin:weather)
timestampu64Unix დროის ნიშანი მილიწამებში
correlation_idOption<String>არასავალდებულო ID დაკავშირებული მოვლენების თვალთვალისთვის

დატვირთვის ფორმატი

დატვირთვები კონვენციით JSON-ად სერიალიზდება. ყოველი თემა საკუთარ დატვირთვის სქემას განსაზღვრავს. მაგალითად:

prx.session.created:

json
{
  "session_id": "sess_abc123",
  "channel": "telegram",
  "user_id": "user:telegram:123456789"
}

prx.tool.after_execute:

json
{
  "session_id": "sess_abc123",
  "tool_name": "shell",
  "command": "ls -la /tmp",
  "duration_ms": 45,
  "success": true
}

კონფიგურაცია

toml
[plugins.event_bus]
enabled = true
max_payload_bytes = 65536           # 64 KB
max_recursion_depth = 8             # უსასრულო მოვლენათა ციკლების თავიდან აცილება
max_subscribers_per_topic = 64      # გამომწერთა ლიმიტი თემაზე
channel_capacity = 1024             # შიდა მოვლენათა რიგის ტევადობა
delivery_timeout_ms = 5000          # ნელი გამომწერებისთვის ვადაგასვლა

კონფიგურაციის მითითება

ველიტიპინაგულისხმევიაღწერა
enabledbooltrueმოვლენათა ავტობუსის ჩართვა ან გამორთვა
max_payload_bytesusize65536მოვლენის დატვირთვის მაქსიმალური ზომა (64 KB)
max_recursion_depthu88მოვლენით-გამოწვეული-მოვლენის ჯაჭვების მაქსიმალური სიღრმე
max_subscribers_per_topicusize64გამომწერთა მაქსიმალური რაოდენობა ზუსტ თემაზე
channel_capacityusize1024მოვლენათა რიგის შემოსაზღვრული არხის ტევადობა
delivery_timeout_msu645000მაქსიმალური დრო გამომწერის მოვლენის დამუშავებისთვის

მოვლენათა ავტობუსის გამოყენება დანამატებში

PDK (დანამატის განვითარების ნაკრები)

PRX PDK WASM დანამატებში მოვლენათა ავტობუსთან ურთიერთქმედების დამხმარე ფუნქციებს უზრუნველყოფს:

rust
use prx_pdk::event_bus;

// მოვლენებზე გამოწერა
event_bus::subscribe("prx.session.created", |event| {
    let payload: SessionCreated = serde_json::from_slice(&event.payload)?;
    log::info!("New session: {}", payload.session_id);
    Ok(())
})?;

// მოვლენის გამოქვეყნება
let payload = serde_json::to_vec(&MyEvent { data: "hello" })?;
event_bus::publish("prx.plugin.my_plugin.my_event", &payload)?;

გამოწერის დეკლარირება დანამატის მანიფესტში

დანამატები გამოწერებს მანიფესტის ფაილში აცხადებენ:

toml
# plugin.toml
[plugin]
name = "my-plugin"
version = "1.0.0"

[permissions]
event_bus_subscribe = [
    "prx.session.*",
    "prx.tool.after_execute",
]
event_bus_publish = [
    "prx.plugin.my_plugin.*",
]

ჰოსტი ამ ნებართვების დეკლარაციებს აღასრულებს. დანამატს არ შეუძლია გამოწერა ან გამოქვეყნება დეკლარირებული ნებართვების გარეთ არსებულ თემებზე.

მიწოდების გარანტიები

მოვლენათა ავტობუსი არა-უმეტეს-ერთხელ მიწოდებას უზრუნველყოფს:

  • მოვლენები ყველა შესაბამის გამომწერს ასინქრონულად ეგზავნება
  • თუ გამომწერი ნელია ან არ პასუხობს, მოვლენა delivery_timeout_ms-ის შემდეგ იგდება
  • თუ შიდა მოვლენათა რიგი სავსეა (channel_capacity მიღწეული), ახალი მოვლენები გაფრთხილებით იგდება
  • არ არსებობს პერსისტენციის, ხელახალი ცდის ან დადასტურების მექანიზმი

გარანტირებული მიწოდების მოთხოვნილი სცენარებისთვის განიხილეთ webhook სისტემის ან გარე შეტყობინებების რიგის გამოყენება.

რეკურსიის დაცვა

როდესაც მოვლენის დამმუშავებელი სხვა მოვლენას გამოაქვეყნებს, ჯაჭვი იქმნება. მოვლენათა ავტობუსი რეკურსიის სიღრმეს თვალყურს ადევნებს და max_recursion_depth-ს აღასრულებს:

prx.session.created           <- სიღრმე 0
  -> დამმუშავებელი აქვეყნებს prx.plugin.audit.session_log    <- სიღრმე 1
    -> დამმუშავებელი აქვეყნებს prx.plugin.metrics.counter     <- სიღრმე 2
      -> ...

თუ სიღრმე ლიმიტს გადააჭარბებს, მოვლენა იგდება და გაფრთხილება აღირიცხება:

WARN event_bus: Recursion depth 8 exceeded for topic prx.plugin.metrics.counter, event dropped

ინსტრუმენტის შესრულების ინტერცეპტირება

prx.tool.before_execute მოვლენა ინტერცეპტირებას უჭერს მხარს. გამომწერებს შეუძლიათ ინსტრუმენტის გამოძახების მოდიფიცირება ან გაუქმება გაშვებამდე:

rust
event_bus::subscribe("prx.tool.before_execute", |event| {
    let mut payload: ToolBeforeExecute = serde_json::from_slice(&event.payload)?;

    // საშიში ბრძანებების დაბლოკვა
    if payload.tool_name == "shell" && payload.args.contains("rm -rf") {
        return Err(EventBusError::Rejected("Dangerous command blocked".into()));
    }

    Ok(())
})?;

როდესაც ნებისმიერი გამომწერი შეცდომას დააბრუნებს, ინსტრუმენტის შესრულება უქმდება და შეცდომა აგენტს ეცნობება.

მონიტორინგი

CLI

bash
# ბოლო მოვლენათა ავტობუსის აქტივობის ნახვა
prx events --tail 50

# თემის შაბლონით ფილტრაცია
prx events --topic "prx.session.*"

# მოვლენის დატვირთვების ჩვენება
prx events --verbose

# გამომწერთა რაოდენობის ნახვა
prx events stats

მეტრიკები

მოვლენათა ავტობუსი Prometheus მეტრიკებს გამოაქვეყნებს:

მეტრიკატიპიაღწერა
prx_event_bus_published_totalCounterთემის მიხედვით გამოქვეყნებული მოვლენების საერთო რაოდენობა
prx_event_bus_delivered_totalCounterგამომწერებისთვის მიწოდებული მოვლენების საერთო რაოდენობა
prx_event_bus_dropped_totalCounterგადაგდებული მოვლენები (რიგი სავსე, ვადაგასვლა, რეკურსია)
prx_event_bus_delivery_duration_secondsHistogramმოვლენების გამომწერებისთვის მიწოდების დრო
prx_event_bus_subscribersGaugeმიმდინარე გამომწერთა რაოდენობა თემის მიხედვით

შეზღუდვები

  • არა-უმეტეს-ერთხელ მიწოდება ნიშნავს, რომ მოვლენები შეიძლება დაიკარგოს, თუ რიგი სავსეა ან გამომწერები ნელია
  • მოვლენათა ავტობუსი PRX პროცესის ლოკალურია; მოვლენები კვანძებზე არ ნაწილდება
  • დატვირთვის ზომა 64 KB-ით არის შეზღუდული; დიდი მონაცემები ჩადგმის ნაცვლად ID-ით უნდა მიეთითოს
  • სიმბოლოანი გამოწერები (განსაკუთრებით prx.**) მნიშვნელოვან დატვირთვას შეიძლება წარმოქმნას; ეკონომიურად გამოიყენეთ
  • დანამატის მოვლენათა დამმუშავებლები WASM სენდბოქსში ეშვება და ფაილურ სისტემასა და ქსელს პირდაპირ ვერ წვდება
  • მოვლენების თანმიმდევრობა საუკეთესო-მცდელობისაა; მაღალი დატვირთვისას გამომწერებმა მოვლენები არათანმიმდევრობით შეიძლება მიიღონ

დაკავშირებული გვერდები

Released under the Apache-2.0 License.