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.