Uzrakstīsim nelielu klientu alfavantage vietnei aiohttp ar pieprasījumiem par mums nepiecieŔamajiem galapunktiem.
Izveidosim aÄ£entu, kas apkopos datus par vÄrtspapÄ«riem un meta informÄciju par tiem.
Bet tas ir tas, ko mÄs darÄ«sim paÅ”a projekta labÄ, un, runÄjot par fausta izpÄti, mÄs iemÄcÄ«simies rakstÄ«t aÄ£entus, kas apstrÄdÄ straumÄÅ”anas notikumus no kafka, kÄ arÄ« kÄ rakstÄ«t komandas (klikŔķa iesaiÅojums), mÅ«su gadÄ«jumÄ - manuÄliem push ziÅojumiem uz tÄmu, kuru aÄ£ents uzrauga.
TreniÅÅ”
AlphaVantage klients
Vispirms uzrakstīsim nelielu aiohttp klientu alfavantage pieprasījumiem.
AlphaVantage API ir diezgan vienkÄrÅ”i un skaisti izstrÄdÄta, tÄpÄc es nolÄmu veikt visus pieprasÄ«jumus, izmantojot Å”o metodi construct_query kur savukÄrt ir http izsaukums.
Es vedu visus laukus uz snake_case komfortam.
Labi, logger.catch dekorÄcija skaistai un informatÄ«vai izsekoÅ”anai.
PS Neaizmirstiet vietÄji pievienot alfavantage marÄ·ieri vietnei config.yml vai eksportÄt vides mainÄ«go HORTON_SERVICE_APIKEY. MÄs saÅemam žetonu Å”eit.
CRUD klase
Mums bÅ«s vÄrtspapÄ«ru kolekcija, lai saglabÄtu metainformÄciju par vÄrtspapÄ«riem.
PagaidÄm mums bÅ«s visvienkÄrÅ”ÄkÄ aplikÄciju izveide, nedaudz vÄlÄk to paplaÅ”inÄsim, tomÄr, lai neliktu gaidÄ«t, Å”eit atsauces uz App-class. Iesaku arÄ« apskatÄ«t iestatÄ«jumu klasi, jo tÄ ir atbildÄ«ga par lielÄko daļu iestatÄ«jumu.
GalvenÄ daļa
AÄ£ents vÄrtspapÄ«ru saraksta vÄkÅ”anai un uzturÄÅ”anai
TÄtad, vispirms mÄs iegÅ«stam faust lietojumprogrammas objektu - tas ir diezgan vienkÄrÅ”i. TÄlÄk mÄs skaidri deklarÄjam tÄmu savam aÄ£entam... Å eit ir vÄrts pieminÄt, kas tas ir, kÄds ir iekÅ”Äjais parametrs un kÄ to var sakÄrtot citÄdi.
IekÅ”Äjais parametrs, diezgan labi aprakstÄ«ts faust dokumentÄ, ļauj konfigurÄt tÄmu tieÅ”i kodÄ, protams, tas nozÄ«mÄ faust izstrÄdÄtÄju sniegtos parametrus, piemÄram: saglabÄÅ”ana, saglabÄÅ”anas politika (pÄc noklusÄjuma dzÄst, bet var iestatÄ«t kompakts), nodalÄ«jumu skaits vienÄ tÄmÄ (rÄdÄ«tÄjidarÄ«t, piemÄram, mazÄk nekÄ globÄla nozÄ«me pieteikumi faust).
KopumÄ aÄ£ents var izveidot pÄrvaldÄ«tu tÄmu ar globÄlÄm vÄrtÄ«bÄm, tomÄr man patÄ«k visu skaidri deklarÄt. TurklÄt dažus aÄ£enta sludinÄjuma tÄmas parametrus (piemÄram, nodalÄ«jumu skaitu vai saglabÄÅ”anas politiku) nevar konfigurÄt.
LÅ«k, kÄ tas varÄtu izskatÄ«ties, manuÄli nedefinÄjot tÄmu:
Nu, tagad aprakstīsim, ko darīs mūsu aģents :)
app = get_app()
collect_securities_topic = app.topic("collect_securities", internal=True)
@app.agent(collect_securities_topic)
async def collect_securities(stream: StreamT[None]) -> AsyncIterable[bool]:
async with aiohttp.ClientSession() as session:
async for _ in stream:
logger.info("Start collect securities")
client = AlphaVantageClient(session, API_KEY)
securities = await client.get_securities()
for security in securities:
await SecurityCRUD.update_one(
{"symbol": security["symbol"], "exchange": security["exchange"]}, security, upsert=True
)
yield True
TÄtad aÄ£enta darbÄ«bas sÄkumÄ mÄs atveram aiohttp sesiju pieprasÄ«jumiem, izmantojot mÅ«su klientu. TÄdÄjÄdi, startÄjot strÄdnieku, kad tiek palaists mÅ«su aÄ£ents, nekavÄjoties tiks atvÄrta sesija - viena, uz visu laiku, kad darbinieks darbojas (vai vairÄkas, ja mainÄ«sit parametru vienlaicÄ«ba no aÄ£enta ar noklusÄjuma vienÄ«bu).
TÄlÄk mÄs sekojam straumei (ievietojam ziÅojumu _, jo mums, Å”ajÄ aÄ£entÄ, nerÅ«p mÅ«su tÄmas ziÅojumu saturs, ja tie pastÄv paÅ”reizÄjÄ nobÄ«dÄ, pretÄjÄ gadÄ«jumÄ mÅ«su cikls gaidÄ«s to ieraÅ”anos. MÅ«su cilpas ietvaros mÄs reÄ£istrÄjam ziÅojuma saÅemÅ”anu, iegÅ«stam aktÄ«vo (get_securities pÄc noklusÄjuma atgriež tikai aktÄ«vus, skatiet klienta kodu) vÄrtspapÄ«ru sarakstu un saglabÄjam to datu bÄzÄ, pÄrbaudot, vai ir vÄrtspapÄ«rs ar tÄdu paÅ”u atzÄ«mi un apmaiÅa datubÄzÄ , ja ir, tad tas (papÄ«rs) vienkÄrÅ”i tiks atjauninÄts.
SÄksim savu radÄ«Å”anu!
> docker-compose up -d
... ŠŠ°ŠæŃŃŠŗ ŠŗŠ¾Š½ŃŠµŠ¹Š½ŠµŃŠ¾Š² ...
> faust -A horton.agents worker --without-web -l info
PS funkcijas tÄ«mekļa komponents Rakstos Faustu neuzskatÄ«Å”u, tÄpÄc uzlikÄm atbilstoÅ”u karogu.
SavÄ palaiÅ”anas komandÄ mÄs teicÄm faustam, kur meklÄt lietojumprogrammas objektu un ko ar to darÄ«t (palaist darbinieku) ar informÄcijas žurnÄla izvades lÄ«meni. MÄs iegÅ«stam Å”Ädu izvadi:
ApskatÄ«sim nodalÄ«jumu komplektu. KÄ redzam, tika izveidota tÄma ar nosaukumu, ko norÄdÄ«jÄm kodÄ, noklusÄto nodalÄ«jumu skaitu (8, Åemts no topic_partitions - lietojumprogrammas objekta parametrs), jo mÄs nenorÄdÄ«jÄm savai tÄmai atseviŔķu vÄrtÄ«bu (izmantojot nodalÄ«jumus). Darbinieka palaistajam aÄ£entam tiek pieŔķirti visi 8 nodalÄ«jumi, jo tas ir vienÄ«gais, taÄu par to sÄ«kÄk tiks runÄts sadaÄ¼Ä par klasterizÄciju.
Nu, tagad mÄs varam pÄriet uz citu terminÄļa logu un nosÅ«tÄ«t tukÅ”u ziÅojumu mÅ«su tÄmai:
PS izmanto @ mÄs parÄdÄm, ka mÄs sÅ«tÄm ziÅojumu uz tÄmu ar nosaukumu ācollect_securitiesā.
Å ajÄ gadÄ«jumÄ ziÅojums tika nosÅ«tÄ«ts uz 6. nodalÄ«jumu ā to varat pÄrbaudÄ«t, dodoties uz kafdrop on localhost:9000
Dodoties uz terminÄļa logu ar mÅ«su darbinieku, mÄs redzÄsim priecÄ«gu ziÅojumu, kas nosÅ«tÄ«ts, izmantojot loguru:
2020-09-23 00:26:37.304 | INFO | horton.agents:collect_securities:40 - Start collect securities
MÄs varam arÄ« izpÄtÄ«t mongo (izmantojot Robo3T vai Studio3T) un redzÄt, ka vÄrtspapÄ«ri atrodas datu bÄzÄ:
Es neesmu miljardieris, un tÄpÄc mÄs esam apmierinÄti ar pirmo skatÄ«Å”anÄs iespÄju.
Laime un prieks - pirmais aģents gatavs :)
Aģents gatavs, lai dzīvo jaunais aģents!
JÄ, kungi, esam veikuÅ”i tikai 1/3 no Ŕī raksta sagatavotÄ ceļa, bet nekautrÄjieties, jo tagad bÅ«s vieglÄk.
TÄtad tagad mums ir nepiecieÅ”ams aÄ£ents, kas apkopo meta informÄciju un ievieto to savÄkÅ”anas dokumentÄ:
collect_security_overview_topic = app.topic("collect_security_overview", internal=True)
@app.agent(collect_security_overview_topic)
async def collect_security_overview(
stream: StreamT[?],
) -> AsyncIterable[bool]:
async with aiohttp.ClientSession() as session:
async for event in stream:
...
TÄ kÄ Å”is aÄ£ents apstrÄdÄs informÄciju par konkrÄtu vÄrtspapÄ«ru, mums ziÅojumÄ ir jÄnorÄda Ŕī vÄrtspapÄ«ra svÄrsts (simbols). Å im nolÅ«kam faustÄ ir Ieraksti ā klases, kas deklarÄ ziÅojuma shÄmu aÄ£enta tÄmÄ.
Å ajÄ gadÄ«jumÄ pÄriesim pie records.pyun aprakstiet, kÄ vajadzÄtu izskatÄ«ties vÄstÄ«jumam par Å”o tÄmu:
import faust
class CollectSecurityOverview(faust.Record):
symbol: str
exchange: str
KÄ jau varÄja nojaust, fausts izmanto python tipa anotÄciju, lai aprakstÄ«tu ziÅojuma shÄmu, tÄpÄc bibliotÄkas atbalstÄ«tÄ minimÄlÄ versija ir 3.6.
Atgriezīsimies pie aģenta, iestatīsim veidus un pievienosim to:
KÄ redzat, tÄmas inicializÄcijas metodei mÄs nododam jaunu parametru ar shÄmu - value_type. TurklÄt viss notiek pÄc tÄs paÅ”as shÄmas, tÄpÄc es neredzu jÄgu kavÄties pie kaut kÄ cita.
PÄdÄjais pieskÄriens ir pievienot metainformÄcijas vÄkÅ”anas aÄ£entam izsaukumu collection_securitites:
ZiÅojumam izmantojam iepriekÅ” izziÅoto shÄmu. Å ajÄ gadÄ«jumÄ es izmantoju .cast metodi, jo mums nav jÄgaida aÄ£enta rezultÄts, taÄu ir vÄrts pieminÄt, ka veidus nosÅ«tÄ«t ziÅu tÄmai:
cast - nebloÄ·Ä, jo negaida rezultÄtu. JÅ«s nevarat nosÅ«tÄ«t rezultÄtu uz citu tÄmu kÄ ziÅojumu.
sÅ«tÄ«t - nebloÄ·Ä, jo negaida rezultÄtu. TÄmÄ varat norÄdÄ«t aÄ£entu, uz kuru tiks nosÅ«tÄ«ts rezultÄts.
jautÄt - gaida rezultÄtu. TÄmÄ varat norÄdÄ«t aÄ£entu, uz kuru tiks nosÅ«tÄ«ts rezultÄts.
TÄtad ar aÄ£entiem Å”odien viss!
SapÅu komanda
PÄdÄjais, ko solÄ«jos uzrakstÄ«t Å”ajÄ daļÄ, ir komandas. KÄ minÄts iepriekÅ”, komandas programmÄ Faust ir iesaiÅojums ap klikŔķi. Faktiski Faust vienkÄrÅ”i pievieno mÅ«su pielÄgoto komandu savai saskarnei, norÄdot taustiÅu -A
PÄc izsludinÄto aÄ£entu ienÄkÅ”anas agents.py pievienot funkciju ar dekoratoru app.commandsaucot metodi mest Ń vÄkt_vÄrtspapÄ«rus:
@app.command()
async def start_collect_securities():
"""Collect securities and overview."""
await collect_securities.cast()
TÄdÄjÄdi, ja mÄs izsauksim komandu sarakstu, mÅ«su jaunÄ komanda bÅ«s tajÄ:
> faust -A horton.agents --help
....
Commands:
agents List agents.
clean-versions Delete old version directories.
completion Output shell completion to be evaluated by the...
livecheck Manage LiveCheck instances.
model Show model detail.
models List all available models as a tabulated list.
reset Delete local table state.
send Send message to agent/topic.
start-collect-securities Collect securities and overview.
tables List available tables.
worker Start worker instance for given app.
MÄs to varam izmantot tÄpat kÄ jebkurÅ” cits, tÄpÄc restartÄsim faust worker un sÄksim pilnvÄrtÄ«gu vÄrtspapÄ«ru kolekciju:
> faust -A horton.agents start-collect-securities
Kas notiks tÄlÄk?
NÄkamajÄ daļÄ, izmantojot atlikuÅ”os aÄ£entus kÄ piemÄru, aplÅ«kosim grimÅ”anas mehÄnismu galÄjÄ«bu meklÄÅ”anai gada tirdzniecÄ«bas slÄgÅ”anas cenÄs un aÄ£entu kronu palaiÅ”anu.
PS Zem pÄdÄjÄs daļas man jautÄja par faust and confluent kafka (kÄdas Ä«paŔības ir konfluentam?). Å Ä·iet, ka konfluents daudzÄjÄdÄ ziÅÄ ir funkcionÄlÄks, taÄu fakts ir tÄds, ka Faustam nav pilnÄ«gs klientu atbalsts konfluentam - tas izriet no klientu ierobežojumu apraksti dok.