αž€αž·αž…αŸ’αž…αž€αžΆαžšαž•αŸ’αž‘αŸƒαžαžΆαž„αž€αŸ’αžšαŸ„αž™αž“αŸ…αž›αžΎ Faust, αž•αŸ’αž“αŸ‚αž€αž‘αžΈ I: αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†

αž€αž·αž…αŸ’αž…αž€αžΆαžšαž•αŸ’αž‘αŸƒαžαžΆαž„αž€αŸ’αžšαŸ„αž™αž“αŸ…αž›αžΎ Faust, αž•αŸ’αž“αŸ‚αž€αž‘αžΈ I: αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†

αž˜αŸ‰αŸαž…αž€αŸαžαŸ’αž‰αž»αŸ†αž˜αž€αžšαžŸαŸ‹αž“αŸ…αž”αŸ‚αž”αž“αŸαŸ‡?

αž˜αž·αž“αž™αžΌαžšαž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž€αžΆαžšαž›αžΎαž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž€αŸ’αžšαŸ„αž™αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αžŠαŸ‚αž›αž˜αžΆαž“αž”αž“αŸ’αž‘αž»αž€αžαŸ’αž–αžŸαŸ‹ αžŠαŸ‚αž›αž€αŸ’αž“αž»αž„αž“αŸ„αŸ‡αž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαžšαŸ€αž”αž…αŸ†αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž‡αžΆαž”αŸ’αžšαž…αžΆαŸ†αž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžšαž•αŸ’αž‘αŸƒαžαžΆαž„αž€αŸ’αžšαŸ„αž™αž˜αž½αž™αž…αŸ†αž“αž½αž“αž’αŸ†αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž‚αžŽαž“αžΆαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰ αž“αž·αž„αžŸαŸ†αžŽαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž—αžΆαž‚αžΈαž‘αžΈαž”αžΈαŸ” αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸαŸ‡αž‚αžΊαž’αžŸαž˜αž€αžΆαž› αž αžΎαž™αž˜αž»αž“αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž˜αž€ αžœαžΆαž˜αžΆαž“αž™αž“αŸ’αžαž€αžΆαžšαžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž·αž…αŸ’αž…αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ cronαŸ– αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž–αŸαž›αžœαŸαž›αžΆαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αž“αž·αž„αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αžšαž»αž˜αž“αŸƒ coroutines αžαžΆαž˜αžšαž™αŸˆαž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ† - αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αž”αžΆαž“αž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆαž’αžΆαž…αž‘αž‘αž½αž›αž™αž€αž”αžΆαž“αžšαž αžΌαžαžŠαž›αŸ‹αž˜αžΆαž“αž‘αž˜αŸ’αž›αžΆαž”αŸ‹αž”αŸ‚αž”αž“αŸαŸ‡αžšαžΆαž”αŸ‹αžŸαž·αž”αž“αž·αž„αžšαžΆαž”αŸ‹αžšαž™αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž…αŸ†αž“αž½αž“αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž›αžΎαžŸαž–αžΈαž–αžΈαžšαž–αžΆαž“αŸ‹ αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž‚αž·αžαž’αŸ†αž–αžΈαž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž‡αž½αžšαž€αž·αž…αŸ’αž…αž€αžΆαžšαž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™αž˜αŸαžαŸ’αž™αž›αŸ‹ αž€αž˜αŸ’αž˜αž€αžšαž‡αžΆαž…αŸ’αžšαžΎαž“αž“αžΆαž€αŸ‹αž‡αžΆαžŠαžΎαž˜αŸ”

αžŠαŸ†αž”αžΌαž„αžαŸ’αž‰αž»αŸ†αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžŸαžΆαž€αž›αŸ’αž”αž„αž”αŸ’αžšαžΎ Celery αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž’αŸ’αž›αžΆαž”αŸ‹αž”αŸ’αžšαžΎαž–αžΈαž˜αž»αž“αž˜αž€αŸ” αžŠαŸ„αž™αžŸαžΆαžšαž›αž€αŸ’αžαžŽαŸˆαž’αžŸαž˜αž€αžΆαž›αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ†αžŽαž½αžš αž αžΎαž™αž”αžΆαž“αžƒαžΎαž‰ αž’αžαŸ’αžαž”αž‘, αž“αž·αž„ αž‚αž˜αŸ’αžšαŸ„αž„αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αž’αžαŸ’αžαž”αž‘αŸ”

αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž“αž·αž™αžΆαž™αžšαžΏαž„αž“αŸαŸ‡ αž‚αž˜αŸ’αžšαŸ„αž„αž“αŸαŸ‡αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαžŽαžΆαžŸαŸ‹ αž αžΎαž™αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αž‡αŸ„αž‚αž‡αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸƒαž€αŸ’αžšαž»αž˜αžšαž”αžŸαŸ‹αž™αžΎαž„ αž αžΎαž™αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αž•αŸ’αž‘αžΆαž›αŸ‹αž”αžΆαž“αž“αž·αž™αžΆαž™αžαžΆαž‚αžΆαžαŸ‹αž’αžΆαž…αžšαž˜αŸ€αž›αžœαžΆαž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜αžŠαŸ„αž™αž”αŸ’αžšαžΎαž’αžΆαž„αž’αžŸαž˜αž€αžΆαž›αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž‡αžΆαž’αž€αž»αžŸαž› αžœαžΆαž–αž·αžαž‡αžΆαž˜αž·αž“αžŸαž˜αž“αžΉαž„αžαŸ’αž‰αž»αŸ†αž‘αŸ αžŠαžΌαž…αžŠαŸ‚αž›αžœαžΆαž”αžΆαž“αž”αŸ’αžšαŸ‚αž€αŸ’αž›αžΆαž™ αž”αž‰αŸ’αž αžΆ αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαž„αžΆαžšαž‡αžΆαž€αŸ’αžšαž»αž˜ (αžŸαžΌαž˜αž˜αžΎαž›αŸ” αž€αŸ’αžšαž»αž˜) αž“αŸ…αž–αŸαž›αžŸαžšαžŸαŸαžš issue αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘αžšαž½αž…αž αžΎαž™ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαžšαž„αžΆαžšαž”αžΆαž“αž”αž“αŸ’αžαž’αžŸαŸ‹αžšαž™αŸˆαž–αŸαž›αž˜αž½αž™αžαŸ‚αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŽαžΆαž€αŸαžŠαŸ„αž™ αžŸαžΌαž˜αžŸαŸ†αžŽαžΆαž„αž›αŸ’αž’αžŠαž›αŸ‹αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’ αž“αž·αž„αž’αŸ’αžœαžΈαŸ—αžŠαŸ‚αž›αž›αŸ’αž’αž”αŸ†αž•αž»αž αž–αŸ’αžšαŸ„αŸ‡αž˜αžΆαž“αž€αžΆαžšαž„αžΆαžšαžšαž½αž…αž αžΎαž™αž“αŸ…αž›αžΎ lib... αž‡αžΆαž‘αžΌαž‘αŸ… αž…αŸ†αž“αž»αž…αž‚αžΊαž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ’αž‰αž»αŸ† αž αžΎαž™αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαŸ‚αž‘αŸ…αž‡αžΆαžŸαžΎαž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž‰αž»αŸ†αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αž€αž·αž…αŸ’αž…αž€αžΆαžšαž˜αž½αž™αž…αŸ†αž“αž½αž“αž˜αžΆαž“αžŸαŸ†αžŽαžΎ 2-3 http αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž€αžΆαžšαž„αžΆαžš αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ TCP αž…αŸ†αž“αž½αž“ 4 αž–αžΆαž“αŸ‹ αž”αŸ’αžšαž αŸ‚αž›αžšαŸ€αž„αžšαžΆαž›αŸ‹ 2 αž˜αŸ‰αŸ„αž„αž˜αŸ’αžαž„ - αž˜αž·αž“αž›αŸ’αž’αž‘αŸ... αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž”αž„αŸ’αž€αžΎαžαžœαž‚αŸ’αž‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαž—αŸαž‘αž˜αž½αž™ αž—αžΆαžšαž€αž·αž…αŸ’αž…αž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αž˜αŸ’αž˜αž€αžšαŸ” αž”αž“αŸ’αžαž·αž…αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž’αŸ†αž–αžΈαž…αŸ†αž“αž½αž“αžŠαŸαž’αŸ†αž“αŸƒαžŸαŸ†αžŽαžΎαžαžΆαž˜αžšαž™αŸˆ aiohttp αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

αž€αŸ’αž“αž»αž„αž“αŸαž™αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž˜αžΎαž› αž‡αž˜αŸ’αž˜αžΎαžŸαž‡αŸ†αž“αž½αžŸ αž αžΎαž™αž”αžΆαž“αžšαž€αžƒαžΎαž‰αžœαžΆ! αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαž celery αž‡αžΆαž–αž·αžŸαŸαžŸαžŠαžΌαž…αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž™αž›αŸ‹ សួរ Solem, αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž‘αžΎαž„ FaustαžŠαžΎαž˜αž‘αžΎαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„ αž—αžΆαž–αžŸαžΆαž αžΆαžœ. Faust αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ†αž•αž»αžŸαž‚αŸ†αž“αž·αžαžŠαŸ„αž™ Kafka Stream αž“αž·αž„αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ Kafka αž€αŸ’αž“αž»αž„αž“αžΆαž˜αž‡αžΆαžˆαŸ’αž˜αž½αž‰αž€αžŽαŸ’αžαžΆαž› Rocksdb αž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž›αž‘αŸ’αž’αž•αž›αž–αžΈαž€αžΆαžšαž„αžΆαžšαžšαž”αžŸαŸ‹αž—αŸ’αž“αžΆαž€αŸ‹αž„αžΆαžš αž αžΎαž™αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžŸαŸ†αžαžΆαž“αŸ‹αž”αŸ†αž•αž»αžαž“αŸ„αŸ‡αž‚αžΊαžαžΆαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž‚αžΊαž’αžŸαž˜αž€αžΆαž›αŸ”

αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž˜αžΎαž›αž•αž„αžŠαŸ‚αžšαŸ” αž€αžΆαžšαž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αžšαž αŸαžŸ celery αž“αž·αž„ faust αž–αžΈαž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαž€αŸ’αžšαŸ„αž™: αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ αž—αžΆαž–αžαž»αžŸαž‚αŸ’αž“αžΆαžšαžœαžΆαž„αžˆαŸ’αž˜αž½αž‰αž€αžŽαŸ’αžαžΆαž› αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αž·αž…αŸ’αž…αž€αžΆαžšαž”αž‹αž˜αŸ” αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αžŽαžΆαžŸαŸ‹αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆ αž›αž€αŸ’αžαžŽαŸˆαž–αž·αžŸαŸαžŸαžŠαŸαž›αŸ’αž’αž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„ faust αž‘αžΆαž€αŸ‹αž‘αžΆαž‰αž€αžΆαžšαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹ - αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αžœαžΆαž™αž”αž‰αŸ’αž…αžΌαž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž‘αŸ…αž€αžΆαž“αŸ‹αž”αŸ’αžšαž’αžΆαž“αž”αž‘αŸ”

αžαžΎβ€‹αž™αžΎαž„β€‹αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈ?

αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αžαŸ’αž›αžΈαŸ— αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž’αŸ’αž“αž€αž–αžΈαžšαž”αŸ€αž”αž”αŸ’αžšαž˜αžΌαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž–αžΈαž€αž·αž…αŸ’αž…αž€αžΆαžšαž•αŸ’αž‘αŸƒαžαžΆαž„αž€αŸ’αžšαŸ„αž™αžŠαŸ„αž™αž”αŸ’αžšαžΎ Faust αŸ” αž”αŸ’αžšαž—αž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž§αž‘αžΆαž αžšαžŽαŸαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αžΉαž„αž˜αžΆαž“αžŠαžΌαž…αžŠαŸ‚αž›αžˆαŸ’αž˜αŸ„αŸ‡αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰ alphavantage.co. αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αžŸαžšαžŸαŸαžšαž—αŸ’αž“αžΆαž€αŸ‹αž„αžΆαžš (αž›αž·αž… αž”αŸ’αžšαž’αžΆαž“αž”αž‘ αž—αžΆαž‚αžαžΆαžŸ) αžšαž”αŸ€αž”αž’αž“αž»αžœαžαŸ’αžαž’αž˜αŸ’αž˜αžαžΆ (cron) αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ faust cli αžŠαŸ‚αž›αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž”αŸ†αž•αž»αž (αžšαž»αŸ†αž–αžΈαž›αžΎαž€αžΆαžšαž…αž»αž…) αž€αžΆαžšαžŠαžΆαž€αŸ‹αž…αž„αŸ’αž€αŸ„αž˜αžŸαžΆαž˜αž‰αŸ’αž‰ αž αžΎαž™αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž™αžΎαž„αž“αžΉαž„αž—αŸ’αž‡αžΆαž”αŸ‹ datadog ( αž’αŸ’αžœαžΎαž€αžΆαžšαž…αŸαž‰αž–αžΈαž”αŸ’αžšαž’αž”αŸ‹) αž αžΎαž™αž–αŸ’αž™αžΆαž™αžΆαž˜αž˜αžΎαž›αž’αŸ’αžœαžΈαž˜αž½αž™αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αŸ’αžšαž˜αžΌαž›αž”αžΆαž“ αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎ mongodb αž“αž·αž„αž˜αŸ‰αžΌαž‘αŸαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αŸ’αž‡αžΆαž”αŸ‹αŸ”

PS αžœαž·αž“αž·αž…αŸ’αž†αŸαž™αžŠαŸ„αž™αž‘αŸ†αž“αž»αž€αž…αž·αžαŸ’αžαžŠαŸ‚αž›αž…αŸ†αžŽαž»αž…αž’αŸ†αž–αžΈαž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαžαŸ’αž‰αž»αŸ†αž‚αž·αžαžαžΆαž’αŸ’αž“αž€αž’αžΆαž“αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαž’αžαŸ’αžαž”αž‘αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αžΉαž„αž“αŸ…αžαŸ‚αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡:

αž€αž·αž…αŸ’αž…αž€αžΆαžšαž•αŸ’αž‘αŸƒαžαžΆαž„αž€αŸ’αžšαŸ„αž™αž“αŸ…αž›αžΎ Faust, αž•αŸ’αž“αŸ‚αž€αž‘αžΈ I: αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†

αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž‚αž˜αŸ’αžšαŸ„αž„

αžŠαŸ„αž™αžŸαžΆαžšβ€‹αžαŸ‚β€‹αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αžŸαž“αŸ’αž™αžΆβ€‹αžšαž½αž…β€‹αž αžΎαž™ αžŸαžΌαž˜β€‹αž’αŸ’αžœαžΎβ€‹αž”αž‰αŸ’αž‡αžΈβ€‹αžαžΌαž…β€‹αž˜αž½αž™β€‹αž’αŸ†αž–αžΈβ€‹αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜β€‹αž‚αž½αžšβ€‹αž’αŸ’αžœαžΎαŸ–

  1. αž”αž„αŸ’αž αŸ„αŸ‡αž˜αžΌαž›αž”αžαŸ’αžš αž“αž·αž„αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž‘αžΌαž‘αŸ…αž“αŸƒαž–αž½αž€αž‚αŸ (αžšαž½αž˜αž‘αžΆαŸ†αž„αž”αŸ’αžšαžΆαž€αŸ‹αž…αŸ†αžŽαŸαž‰ αž“αž·αž„αž€αžΆαžšαž”αžΆαžαŸ‹αž”αž„αŸ‹ αžαžΆαžšαžΆαž„αžαž»αž›αŸ’αž™αž€αžΆαžš αž›αŸ†αž αžΌαžšαžŸαžΆαž…αŸ‹αž”αŸ’αžšαžΆαž€αŸ‹ - αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž†αŸ’αž“αžΆαŸ†αž˜αž»αž“) - αž‘αŸ€αž„αž‘αžΆαžαŸ‹
  2. αž•αŸ’αž‘αž»αž€αž‘αžΎαž„αž‘αž·αž“αŸ’αž“αž“αŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αžŸαžΆαžŸαŸ’αžšαŸ’αž (αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž†αŸ’αž“αžΆαŸ†αž‡αž½αž‰αžŠαžΌαžšαž“αžΈαž˜αž½αž™αŸ— αžŸαŸ’αžœαŸ‚αž„αžšαž€αžαž˜αŸ’αž›αŸƒαžαŸ’αž›αžΆαŸ†αž„αž“αŸƒαžαž˜αŸ’αž›αŸƒαž”αž·αž‘αž“αŸƒαž€αžΆαžšαž‡αž½αž‰αžŠαžΌαžš) - αž‘αŸ€αž„αž‘αžΆαžαŸ‹
  3. αž”αž„αŸ’αž αŸ„αŸ‡αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αž½αž‰αžŠαžΌαžšαž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αž - αž‘αŸ€αž„αž‘αžΆαžαŸ‹
  4. αž”αž„αŸ’αž αŸ„αŸ‡αž”αž‰αŸ’αž‡αžΈαžŸαžΌαž…αž“αžΆαž€αžšαžαžΆαž˜αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž“αžΈαž˜αž½αž™αŸ— - αž‡αžΆαž‘αŸ€αž„αž‘αžΆαžαŸ‹

αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αžšαŸ†αž–αžΉαž„αž‘αž»αž€ αž™αžΎαž„αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžˆαŸ’αž˜αŸ„αŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αž˜αŸ’αžšαŸ„αž„αž–αžΈαžŠαŸ†αž”αžΌαž„αŸ– αž αŸαžšαžαž»αž“

αž™αžΎαž„αž€αŸ†αž–αž»αž„αžšαŸ€αž”αž…αŸ†αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’

αž…αŸ†αžŽαž„αž‡αžΎαž„αž–αž·αžαž‡αžΆαžαŸ’αž›αžΆαŸ†αž„ αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž‚αžΊαžŸαžšαžŸαŸαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžαžΌαž…αž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ docker-compose αž‡αžΆαž˜αž½αž™ kafka (αž“αž·αž„ zookeeper - αž“αŸ…αž€αŸ’αž“αž»αž„αž’αž»αž„αžαŸ‚αž˜αž½αž™) kafdrop (αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž™αžΎαž„αž…αž„αŸ‹αž˜αžΎαž›αžŸαžΆαžšαž€αŸ’αž“αž»αž„αž”αŸ’αžšαž’αžΆαž“αž”αž‘) mongodbαŸ” αž™αžΎαž„β€‹αž‘αž‘αž½αž›β€‹αž”αžΆαž“ [docker-compose.yml](https://github.com/Egnod/horton/blob/562fa5ec14df952cd74760acf76e141707d2ef58/docker-compose.yml) αž“αŸƒαž‘αž˜αŸ’αžšαž„αŸ‹αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

version: '3'

services:
  db:
    container_name: horton-mongodb-local
    image: mongo:4.2-bionic
    command: mongod --port 20017
    restart: always
    ports:
      - 20017:20017
    environment:
      - MONGO_INITDB_DATABASE=horton
      - MONGO_INITDB_ROOT_USERNAME=admin
      - MONGO_INITDB_ROOT_PASSWORD=admin_password

  kafka-service:
    container_name: horton-kafka-local
    image: obsidiandynamics/kafka
    restart: always
    ports:
      - "2181:2181"
      - "9092:9092"
    environment:
      KAFKA_LISTENERS: "INTERNAL://:29092,EXTERNAL://:9092"
      KAFKA_ADVERTISED_LISTENERS: "INTERNAL://kafka-service:29092,EXTERNAL://localhost:9092"
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT"
      KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAL"
      KAFKA_ZOOKEEPER_SESSION_TIMEOUT: "6000"
      KAFKA_RESTART_ATTEMPTS: "10"
      KAFKA_RESTART_DELAY: "5"
      ZOOKEEPER_AUTOPURGE_PURGE_INTERVAL: "0"

  kafdrop:
    container_name: horton-kafdrop-local
    image: 'obsidiandynamics/kafdrop:latest'
    restart: always
    ports:
      - '9000:9000'
    environment:
      KAFKA_BROKERCONNECT: kafka-service:29092
    depends_on:
      - kafka-service

αž˜αž·αž“αž˜αžΆαž“αž’αŸ’αžœαžΈαžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡αŸ” αž’αŸ’αž“αž€αžŸαŸ’αžαžΆαž”αŸ‹αž–αžΈαžšαž“αžΆαž€αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαž€αžΆαžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ kafka: αž˜αž½αž™ (αžαžΆαž„αž€αŸ’αž“αž»αž„) αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžΎαž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžαžΆαž‰αžŸαž˜αžΆαžŸαž’αžΆαžαž» αž“αž·αž„αž‘αžΈαž–αžΈαžš (αžαžΆαž„αž€αŸ’αžšαŸ…) αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ†αžŽαžΎαž–αžΈαžαžΆαž„αž€αŸ’αžšαŸ… αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž–αž½αž€αž‚αŸαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αžœαžΆαž‘αŸ…αžαžΆαž„αž€αŸ’αžšαŸ…αŸ” 2181 - αž€αŸ†αž–αž„αŸ‹αž•αŸ‚αžŸαž½αž“αžŸαžαŸ’αžœαŸ” αž“αŸ…αžŸαž›αŸ‹ αžαŸ’αž‰αž»αŸ†αž‚αž·αžαžαžΆαž…αŸ’αž”αžΆαžŸαŸ‹αž αžΎαž™αŸ”

αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž‚αŸ’αžšαŸ„αž„αž†αŸ’αž’αžΉαž„αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„

αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ†αžŽαŸ‚αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸƒαž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž™αžΎαž„αž‚αž½αžšαžαŸ‚αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

horton
β”œβ”€β”€ docker-compose.yml
└── horton
    β”œβ”€β”€ agents.py *
    β”œβ”€β”€ alphavantage.py *
    β”œβ”€β”€ app.py *
    β”œβ”€β”€ config.py
    β”œβ”€β”€ database
    β”‚   β”œβ”€β”€ connect.py
    β”‚   β”œβ”€β”€ cruds
    β”‚   β”‚   β”œβ”€β”€ base.py
    β”‚   β”‚   β”œβ”€β”€ __init__.py
    β”‚   β”‚   └── security.py *
    β”‚   └── __init__.py
    β”œβ”€β”€ __init__.py
    β”œβ”€β”€ records.py *
    └── tasks.py *

*αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹ αž™αžΎαž„αž˜αž·αž“αž‘αžΆαž“αŸ‹αž”αŸ‰αŸ‡αžœαžΆαž‘αŸ αž™αžΎαž„αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžšαž‘αž‘αŸαŸ”**

αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž…αžΌαžšαž™αžΎαž„αž”αž“αŸ’αžαŸ‚αž˜αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™αž…αžΆαŸ†αž”αžΆαž…αŸ‹ សរសេរ config αž αžΎαž™αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ… mongodb αŸ” αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž˜αž·αž“αž•αŸ’αžαž›αŸ‹αž’αžαŸ’αžαž”αž‘αž–αŸαž‰αž›αŸαž‰αž“αŸƒαž―αž€αžŸαžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸ„αŸ‡αž‘αŸ αžŠαžΎαž˜αŸ’αž”αžΈαž€αž»αŸ†αž±αŸ’αž™αž–αž“αŸ’αž™αžΆαžšαž–αŸαž› αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹αž€αŸ†αžŽαŸ‚αž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ”

αž…αžΌαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™ αž“αž·αž„αž˜αŸαžαžΆαž’αŸ†αž–αžΈαž‚αž˜αŸ’αžšαŸ„αž„ - pyproject.toml

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž™αžΎαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αž‘αžΎαž„αž—αžΆαž–αž’αžΆαžŸαŸ’αžšαŸαž™ αž“αž·αž„αž”αž„αŸ’αž€αžΎαž virtualenv (αž¬αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαžαž venv αžŠαŸ„αž™αžαŸ’αž›αž½αž“αž―αž„ αž“αž·αž„αž’αŸ’αžœαžΎαž±αŸ’αž™αž”αžšαž·αžŸαŸ’αžαžΆαž“αžŸαž€αž˜αŸ’αž˜)αŸ–

pip3 install poetry (Ссли Π΅Ρ‰Ρ‘ Π½Π΅ установлСно)
poetry install

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžŸαžΌαž˜αž”αž„αŸ’αž€αžΎαž config.yml - αž›αž·αžαž·αžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž“αž·αž„αž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ„αŸ‡αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αžŠαžΆαž€αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ alphavantage αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αž—αŸ’αž›αžΆαž˜αŸ—αŸ” αž’αž‰αŸ’αž…αžΉαž„αžαŸ„αŸ‡αž”αž“αŸ’αžαž‘αŸ… config.py - αžŸαŸ’αžšαž„αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αžΈαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž”αžΆαž‘ αžαŸ’αž‰αž»αŸ†αžŸαžΆαžšαž—αžΆαž– αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αŸ’αžšαžΎ lib αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† - αž’αž„αŸ’αž‚αž»αž™.

αž“αŸ…αž–αŸαž›αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž˜αŸ‰αž»αž„αž αŸ’αž‚αŸ„ αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αžŽαžΆαžŸαŸ‹αŸ” αž”αžΆαž“αž”αŸ’αžšαž€αžΆαžŸ αžαŸ’αž“αžΆαž€αŸ‹αž’αžαž·αžαž·αž‡αž“ αžŠαžΎαž˜αŸ’αž”αžΈαž—αŸ’αž‡αžΆαž”αŸ‹αž“αž·αž„ αžαŸ’αž“αžΆαž€αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ cruds αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž€αžΆαž“αŸ‹αžαŸ‚αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαžŸαŸ†αžŽαž½αžšαž›αžΎαž”αžŽαŸ’αžαž»αŸ†αŸ”

αžαžΎαž“αžΉαž„αž˜αžΆαž“αž’αŸ’αžœαžΈαž€αžΎαžαž‘αžΎαž„αž”αž“αŸ’αž‘αžΆαž”αŸ‹?

αž’αžαŸ’αžαž”αž‘αž˜αž·αž“αž™αžΌαžšαž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αž‘αŸ αž–αŸ’αžšαŸ„αŸ‡αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαž›αžΎαž€αž‘αžΉαž€αž…αž·αžαŸ’αž αž“αž·αž„αž€αžΆαžšαžšαŸ€αž”αž…αŸ† αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž€αž»αŸ†αž”αž“αŸ’αž‘αŸ„αžŸαžαŸ’αž‰αž»αŸ†αž’αžΈ αžαŸ’αž‰αž»αŸ†αžŸαž“αŸ’αž™αžΆαžαžΆαž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αžΉαž„αž˜αžΆαž“αžŸαž€αž˜αŸ’αž˜αž—αžΆαž– αž“αž·αž„αž€αŸ’αžšαžΆαž αŸ’αžœαž·αž€αŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸαŸ‡ αž™αžΎαž„:

  1. αž…αžΌαžšαž™αžΎαž„αžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΌαž…αž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ alphavantage αž“αŸ…αž›αžΎ aiohttp αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαŸ†αžŽαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž…αŸ†αžŽαž»αž…αž”αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ”
  2. αžαŸ„αŸ‡αž”αž„αŸ’αž€αžΎαžαž—αŸ’αž“αžΆαž€αŸ‹αž„αžΆαžšαžŠαŸ‚αž›αž“αžΉαž„αž”αŸ’αžšαž˜αžΌαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αžαžΈαž–αžΈαž˜αžΌαž›αž”αžαŸ’αžš αž“αž·αž„αžαž˜αŸ’αž›αŸƒαž”αŸ’αžšαžœαžαŸ’αžαž·αžŸαžΆαžŸαŸ’αžαŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αž½αž€αž‚αŸαŸ”

αž€αžΌαžŠαž‚αž˜αŸ’αžšαŸ„αž„

αž›αŸαžαž€αžΌαžŠαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž“αŸ‚αž€αž“αŸαŸ‡αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹