[TOC]
مالیاتی منڈیوں کی تیزی سے ترقی اور مقداری تجارت کی مقبولیت کے ساتھ ، زیادہ سے زیادہ تاجروں نے خود کار طریقے سے حکمت عملی پر انحصار کرنا شروع کردیا ہے۔ اس عمل میں ، حکمت عملیوں کے مابین مواصلات اور ہم آہنگی خاص طور پر اہم ہے۔ ایف ایم زیڈ (قیمتی تجارتی پلیٹ فارم) موثر تجارتی حکمت عملیوں کو حقیقی وقت میں مواصلات کے پروٹوکول فراہم کرکے تاجروں کو حکمت عملیوں کے ہموار جوڑ اور حقیقی وقت کے ڈیٹا شیئرنگ کو حاصل کرنے میں مدد کرتا ہے۔
اس مضمون میں ایف ایم زیڈ پلیٹ فارم میں ٹرانزیکشن کی حکمت عملیوں کے درمیان حقیقی ڈیش مواصلات کے پروٹوکول کی گہرائی سے جانچ پڑتال کی جائے گی ، اس کے ڈیزائن کے تصورات ، فعالیت کی خصوصیات اور عملی استعمال میں فوائد کی وضاحت کی جائے گی۔ ہم تفصیلی کیس تجزیہ کے ذریعے دکھائیں گے کہ کس طرح اس پروٹوکول کا استعمال موثر ، مستحکم حکمت عملی مواصلات کے لئے کیا جاسکتا ہے ، جس سے تجارتی حکمت عملیوں کی کارکردگی اور منافع کی کارکردگی میں اضافہ ہوتا ہے۔
چاہے آپ ایف ایم زیڈ کے بارے میں صرف مقداری تجارت کے شوقین ہوں یا تجربہ کار پروفیشنل پروگرامر ہوں ، یہ مضمون آپ کو قیمتی بصیرت اور عملی رہنمائی فراہم کرے گا۔ آئیے ہم ساتھ مل کر ایف ایم زیڈ کی طاقتور خصوصیات کو دریافت کریں اور سیکھیں کہ کس طرح موثر مواصلاتی پروٹوکول کے ذریعہ حکمت عملیوں کے مابین ہم آہنگی ، تجارت کی کارکردگی کو بڑھانے اور مارکیٹ کے مواقع کو پکڑنے کے ل.
ان مطالبات کے منظرناموں سے ظاہر ہوتا ہے کہ ایف ایم زیڈ ٹریڈنگ کی حکمت عملی کے ساتھ حقیقی ڈسک مواصلات کے معاہدوں میں عملی استعمال میں متعدد امکانات اور فوائد ہیں۔ موثر حکمت عملی کے ساتھ ، تاجروں کو مارکیٹ کے پیچیدہ ماحول سے بہتر نمٹنے ، تجارتی حکمت عملی کو بہتر بنانے ، اور تجارتی کارکردگی اور منافع کو بڑھانے کے لئے بہتر حکمت عملی مواصلات کی ضرورت ہے۔
ایک بار جب آپ کو ان کی ضروریات کو سمجھنے کے بعد، آپ کو ان کی ضروریات کو پورا کرنے کے بارے میں سوچنا ہوگا. یہ صرف اس وجہ سے ہے کہ ڈسک اے ڈسک بی کے ساتھ بات چیت کرنا چاہتا ہے، اگرچہ یہ ضروری ہے کہ یہ آسان ہے. تاہم، اس میں مختلف تفصیلات ہیں جو مواصلات کے پروٹوکول کا استعمال کرتے ہوئے معاہدہ کرنے کی ضرورت ہے. ایف ایم زیڈ نے کچھ مقبول مواصلات کے پروٹوکول کو پیک کیا ہے.
mqtt / nats / amqp / کافکا
مواصلات کی ساخت:
جب FMZ پلیٹ فارم پر ان پروٹوکولز کو لاگو کیا جاتا ہے تو ، یہ آسانی سے سمجھا جاتا ہے mqtt / nats / amqp / kafkaDial()
افعال میں استعمالDial()
افعال پیغام رسانی ، سبسکرپشن وغیرہ کے لئے کام کرتے ہیں۔ یہ بھیجے گئے پیغامات پروٹوکول کے سرور ٹرم ایجنٹوں کے ذریعہ ((ریلیز) کے ذریعہ سبسکرپشن کی فلیش ڈسک میں بھیجے جاتے ہیں ، لہذا سب سے پہلے ایک پروٹوکول سرور کو چلانے کی ضرورت ہوتی ہے۔ مثال کے طور پر ، ہم مندرجہ ذیل مثالوں میں مختلف پروٹوکول سرور ٹرم آئینے کی تعیناتی کا استعمال کرتے ہیں۔
Dial فنکشن کے API دستاویز کے سیکشن:https://www.fmz.com/syntax-guide#fun_dial
ڈوکر آئینہ تعینات کرنے سے پہلے ، یاد رکھیں کہ پہلے ڈوکر سافٹ ویئر انسٹال کریں۔
آئیے اب مل کر ایف ایم زیڈ کے تعاون سے چلنے والے مواصلاتی پروٹوکول کے عملی استعمال کو دریافت کریں۔
ایم کیو ٹی ٹی (Message Queuing Telemetry Transport) ایک ہلکا پھلکا پیغام ٹرانسپورٹ پروٹوکول ہے جو خاص طور پر کم بینڈوڈتھ ، اعلی تاخیر یا ناقابل اعتماد نیٹ ورک کے ماحول کے لئے موزوں ہے۔ یہ آئی بی ایم کے اینڈی اسٹینفورڈ کلارک اور آرلن نیپر نے 1999 میں تجویز کیا تھا ، جو بعد میں آئی ایس او معیار (ISO/IEC PRF 20922) بن گیا تھا۔
MQTT پروٹوکول کی اہم خصوصیات: پبلشنگ / سبسکرپشن موڈ
چونکہ ہم ایم کیو ٹی ٹی پروجیکٹ کو سپورٹ کرنے والے سافٹ ویئر کا استعمال کرتے ہوئے ڈوکر آئینہ (eclipse-mosquitto آئینہ) استعمال کرتے ہوئے ایم کیو ٹی ٹی پراکسی سرورز کو تعینات کرتے ہیں ، لہذا پہلے سے ڈوکر انسٹال کریں ، اور بعد میں اس کے بارے میں بات نہ کریں۔
اس سے پہلے کہ ہم آئینہ تعینات کرنے کا حکم چلاتے ہیں، ہمیں پہلے ایک ایجنٹ سرور پروفائل لکھنا ہوگاmosquitto.conf
。
# 配置端口号及远程访问IP
listener 1883 0.0.0.0
# 设置匿名访问
allow_anonymous true
اس کے بعد تعیناتی کا حکم چلاتا ہے:
docker run --rm -p 1883:1883 -v ./mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto
ایک بار جب ایجنٹ سرور کا آئینہ چلتا ہے تو یہ ظاہر ہوتا ہے:
1723012640: mosquitto version 2.0.18 starting
1723012640: Config loaded from /mosquitto/config/mosquitto.conf.
1723012640: Opening ipv4 listen socket on port 1883.
1723012640: mosquitto version 2.0.18 running
اس کے بعد ہم اپنی حکمت عملی کو آزما سکتے ہیں اور اسے عملی جامہ پہنانا چاہتے ہیں۔
var conn = null
function main() {
LogReset(1)
var robotId = _G()
Log("当前实盘robotId:", robotId)
conn = Dial("mqtt://127.0.0.1:1883?topic=test_topic")
if (!conn) {
Log("通信失败!")
return
}
for (var i = 0; i < 10; i++) {
// 写入
var msg = "i: " + i + ", testQueue, robotA, robotId: " + robotId + ", time:" + _D()
conn.write(msg)
Log("向testQueue写入消息:", msg)
// 读取
Log("read:", conn.read(1000), "#FF0000")
Sleep(1000)
}
}
function onexit() {
conn.close()
Log("关闭conn")
}
حکمت عملی کوڈ میں بنیادی طور پر ڈائل فنکشن کا استعمال ہوتا ہے:
Dial("mqtt://127.0.0.1:1883?topic=test_topic")
Dial کے لئے سٹرنگ کے پیرامیٹرز کے آغاز میںmqtt://
یہ پروٹوکول کا نام ہے ، اس کے بعد نگرانی کا پتہ ، بندرگاہ ؛ علامات "؟" کے بعد سبسکرائب / شائع موضوع کا نام ہے ، جہاں ٹیسٹ موضوع کا نام ہے:test_topic
。
مندرجہ بالا حکمت عملی ایک ہی موضوع پر پوسٹ، سبسکرپشن اور ٹیسٹ کے ساتھ چلتی ہے:
یہ بھی ممکن ہے کہ دو فلیش ڈسک ایک دوسرے کو سبسکرائب کریں ، موضوعی معلومات شائع کریں ، جس کی مثال ہم Nats پروٹوکول کے عملی باب میں استعمال کرتے ہیں ، لیکن دوسرے پروٹوکول میں اس طرح کی وضاحت نہیں کی جاتی ہے۔
NATS کا پروٹوکول ایک سادہ ، متن پر مبنی اشاعت / خریداری طرز کا پروٹوکول ہے۔ کلائنٹ gnatsd (NATS سرور) سے جڑتا ہے ، اور gnatsd کے ساتھ بات چیت کرتا ہے ، عام TCP / IP سوٹ پر مبنی بات چیت کرتا ہے ، اور بہت چھوٹے آپریشن سیٹ کی وضاحت کرتا ہے ، جس میں لائنوں کا تبادلہ ختم ہوتا ہے۔ روایتی ، بائنری میسج فارمیٹ کا استعمال کرنے والے میسجنگ سسٹم کے برعکس ، متن پر مبنی NATS پروٹوکول کا استعمال کیا جاتا ہے ، جس سے کلائنٹ کی تکمیل بہت آسان ہوجاتی ہے ، جس میں متعدد پروگرامنگ زبانوں یا اسکرپٹ زبانوں کو آسانی سے منتخب کیا جاسکتا ہے۔
ہر معاہدے کی اپنی خصوصیات ہوتی ہیں اور آپ کو مخصوص دستاویزات اور معلومات مل سکتی ہیں۔
Nats پروٹوکول سرور پر تعینات کریں:
ڈوکر رن
نام نیٹس rm -p 4222:4222 -p 8222:8222 نیٹس http_port 8222 auth admin
یہ ڈوکر کمانڈ خود بخود ڈاؤن لوڈ کرے گی، nats آئینہ چلاتا ہے، پورٹ 4222 کلائنٹ کی طرف سے رسائی حاصل کرنے کے لئے بندرگاہ ہے۔ آئینہ تعینات ہونے کے بعد ایک HTTP مانیٹر بھی بندرگاہ 8222 پر کھل جائے گا.
Listening for client connections on 0.0.0.0:4222
Server is ready
nats سرور ٹرم آئینہ چل رہا ہے اور پورٹ 4222 پر نگرانی کرتا ہے۔
ہم نے دو پالیسیاں بنانی ہیں (ریئل ڈسک) ، ابھی کے لئے پالیسی A اور پالیسی B کا نام دیں۔ دونوں پالیسیوں کا کوڈ بنیادی طور پر ایک جیسا ہے۔ FMZ پلیٹ فارم پر سب سے آسان جاوا اسکرپٹ زبان کا استعمال کرتے ہوئے۔
حکمت عملی A
var connPub = null
var connSub = null
function main() {
var robotId = _G()
Log("当前实盘robotId:", robotId)
connPub = Dial("nats://admin@127.0.0.1:4222?topic=pubRobotA")
if (!connPub) {
Log("通信失败!")
return
}
connSub = Dial("nats://admin@127.0.0.1:4222?topic=pubRobotB")
if (!connSub) {
Log("通信失败!")
return
}
while (true) {
connPub.write("robotA发布的消息,robotId: " + robotId + ", time:" + _D())
var msgRead = connSub.read(10000)
if (msgRead) {
Log("msgRead:", msgRead)
}
LogStatus(_D())
Sleep(10000)
}
}
function onexit() {
connPub.close()
connSub.close()
}
حکمت عملی بی
var connPub = null
var connSub = null
function main() {
var robotId = _G()
Log("当前实盘robotId:", robotId)
connPub = Dial("nats://admin@127.0.0.1:4222?topic=pubRobotB")
if (!connPub) {
Log("通信失败!")
return
}
connSub = Dial("nats://admin@127.0.0.1:4222?topic=pubRobotA")
if (!connSub) {
Log("通信失败!")
return
}
while (true) {
connPub.write("robotB发布的消息,robotId: " + robotId + ", time:" + _D())
var msgRead = connSub.read(10000)
if (msgRead) {
Log("msgRead:", msgRead)
}
LogStatus(_D())
Sleep(10000)
}
}
function onexit() {
connPub.close()
connSub.close()
}
یہ دونوں حکمت عملی بنیادی طور پر ایک جیسی ہیں ، لیکن ایک دوسرے کو پوسٹ کرنا ، سبسکرائب کرنا ، سبسکرائب کرنا ، پوسٹ کرنا ، پوسٹ کرنا اور معلومات شائع کرنا مختلف ہیں۔
مثال کے طور پر حکمت عملی بی:
1، استعمالDial()
فنکشن کلائنٹ سے منسلک سرورز کے لئے اشیاء تخلیق کرتا ہےconnPub
اس کے علاوہ ، ہم نے اپنے صارفین کے لئے ایک نیا صفحہ شائع کیا ہے۔
var connPub = ڈائل کریں127.0.0.1:4222?topic=pubRobotB”)
Dial فنکشن کے لئے پیرامیٹرز کی تعداد سٹرنگ، شروعnats://
اس کا مطلب یہ ہے کہ Nats پروٹوکول کا استعمال کرتے ہوئے مواصلات، اور پھرadmin
Docker Mirror کی تعیناتی کے وقت سیٹ اپ کی گئی ایک سادہ توثیقی معلوماتauth admin
، اس کے بعد سروس ایڈریس اور پورٹ کے بعد "@127.0.0.1:4222
اس کے علاوہ ، ہم نے اپنے صارفین کے لئے ایک نیا صفحہ شائع کیا ہے:topic=pubRobotB
نوٹ کریں کہ پہلے والے پتے کے درمیان "کیا؟" علامت کے ساتھ وقفہ لگائیں۔
2، استعمالDial()
فنکشن کلائنٹ سے منسلک سرورز کے لئے اشیاء تخلیق کرتا ہےconnSub
اس کے علاوہ ، آپ کو اس موضوع پر سبسکرائب کرنے کی ضرورت ہے:
var connSub = ڈائل کریں127.0.0.1:4222?topic=pubRobotA”)
فرق صرف اتنا ہےtopic=pubRobotA
اس کی وجہ یہ ہے کہ آپ کو سبسکرائب کرنے کی ضرورت ہے۔pubRobotA
。
پالیسی A میں سبسکرپشن ، شائع کرنے اور منسلک اشیاء کی تخلیق اور استعمال کے لئے ، جیسا کہ اوپر بیان کیا گیا ہے۔
حکمت عملی A کام کر رہی ہے
حکمت عملی B کام کر رہی ہے
اس طرح ایک سادہ NATS پروٹوکول کی درخواست کی مثال حاصل کی گئی ہے جس میں ڈسک A اور ڈسک B کے درمیان باہمی اشتراک ، پیغام رسانی اور مواصلات کے لئے پیغام بھیجا جاتا ہے۔
غیر ہم آہنگ مواصلات میں ، پیغام فوری طور پر وصول کنندہ تک نہیں پہنچتا ہے ، بلکہ اسے ایک کنٹینر میں محفوظ کیا جاتا ہے ، جب کچھ شرائط پوری ہوجاتی ہیں تو ، پیغام کو کنٹینر کے ذریعہ وصول کنندہ کو بھیج دیا جاتا ہے ، یہ کنٹینر پیغام کی قطار ہے ، اور اس کام کو انجام دینے کے لئے دونوں فریقوں اور کنٹینر اور اس کے مختلف اجزاء کو یکساں معاہدوں اور قواعد پر عمل کرنے کی ضرورت ہوتی ہے ، اے ایم کیو پی ایک ایسا پروٹوکول ہے ، جس کے مطابق پیغام بھیجنے والے اور وصول کرنے والے فریقوں کے ساتھ اس پروٹوکول پر عمل پیرا ہونے سے غیر ہم آہنگ مواصلات کا حصول ممکن ہے۔ یہ پروٹوکول پیغام کی شکل اور کام کرنے کا طریقہ طے کرتا ہے۔
ہر معاہدے کی اپنی خصوصیات ہوتی ہیں اور آپ کو مخصوص دستاویزات اور معلومات مل سکتی ہیں۔
amqp پروٹوکول سرور پر تعینات کریں:
docker run
rm hostname my-rabbit name rabbit -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=q -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3-management
جب آپ ڈوکر آئینہ تعینات کرتے ہیں تو ، یہ خود بخود ڈاؤن لوڈ ہوجاتا ہے ، اور جب یہ مکمل ہوجاتا ہے تو یہ ظاہر ہوتا ہے:
2024-08-06 09:02:46.248936+00:00 [info] <0.9.0> Time to start RabbitMQ: 15569 ms
ایک بار جب سرور کی مرئیت کو اچھی طرح سے تعینات کیا جاتا ہے تو ، ٹیسٹ کی مثال لکھیں:
var conn = null
function main() {
LogReset(1)
var robotId = _G()
Log("当前实盘robotId:", robotId)
conn = Dial("amqp://q:admin@127.0.0.1:5672/?queue=robotA_Queue")
if (!conn) {
Log("通信失败!")
return
}
for (var i = 0; i < 10; i++) {
// 读取
Log("read:", conn.read(1000), "#FF0000")
// 写入
var msg = "i: " + i + ", testQueue, robotA, robotId: " + robotId + ", time:" + _D()
conn.write(msg)
Log("向testQueue写入消息:", msg)
Sleep(1000)
}
}
function onexit() {
conn.close()
Log("关闭conn")
}
amqp پروٹوکول کا استعمال کرتے ہوئے قطار کو نوٹ کرنے کی ضرورت ہے کہ شائع ہونے کے بعد پیغامات قطار میں مستقل طور پر موجود ہیں ، مثال کے طور پر ، ہم پہلے مثال کے کوڈ کو ایک بار چلاتے ہیں ؛ ہم قطار میں 10 پیغامات لکھتے ہیں۔ پھر ہم دوسری بار چلاتے ہیں جہاں ہم پڑھ سکتے ہیں جب یہ پہلی بار لکھا گیا پیغام دوبارہ پڑھتا ہے۔ جیسا کہ دکھایا گیا ہے:
آپ اسکرین شاٹ میں سرخ تیر کی طرف اشارہ کرتے ہوئے دو لاگ ان پیغامات دیکھ سکتے ہیں جو وقت کے ساتھ مماثل نہیں ہیں کیونکہ سرخ رنگ میں یہ پڑھا ہوا پیغام ہے جو پالیسی کوڈ کو پہلی بار چلانے پر قطار میں لکھا گیا ہے۔
اس خصوصیت کی بنیاد پر کچھ ضروریات کو پورا کیا جاسکتا ہے ، مثال کے طور پر: حکمت عملی کی اصلی ڈسک کو دوبارہ شروع کرنے کے بعد ، قطار سے ریکارڈ شدہ مارکیٹ کے اعداد و شمار کو ابھی بھی حاصل کیا جاسکتا ہے ، جو ابتدائی حساب کتاب جیسے کاموں کے لئے استعمال ہوتا ہے۔
اپاچی کافکا ایک تقسیم شدہ ڈیٹا اسٹوریج ہے جو اسٹریم ڈیٹا کو ریئل ٹائم میں نکالنے اور پروسیس کرنے کے لئے موزوں ہے۔ اسٹریم ڈیٹا کا مطلب ہے ہزاروں ڈیٹا ذرائع سے مستقل طور پر تیار کردہ ڈیٹا ، جو عام طور پر بیک وقت ڈیٹا ریکارڈ بھیج سکتا ہے۔ اسٹریم پلیٹ فارم کو ان مسلسل آنے والے اعداد و شمار کو پروسیس کرنے کی ضرورت ہوتی ہے ، جو ترتیب میں آہستہ آہستہ پروسیس ہوتے ہیں۔
Kafka اپنے صارفین کو تین اہم خصوصیات پیش کرتا ہے:
کافکا بنیادی طور پر ریئل ٹائم اسٹریم ڈیٹا پائپ لائنز اور ایپلی کیشنز کی تعمیر کے لئے استعمال کیا جاتا ہے۔ یہ پیغام رسانی ، اسٹوریج اور اسٹریم پروسیسنگ کی خصوصیات کو یکجا کرتا ہے تاکہ تاریخی اور ریئل ٹائم ڈیٹا کو محفوظ کیا جاسکے۔
کافکا ایجنٹ کی جانب سے ڈوکر کی تصویر:
docker run --rm --name kafka-server --hostname kafka-server -p 9092:9092 -p 9093:9093 \
-e KAFKA_CFG_NODE_ID=0 \
-e KAFKA_CFG_PROCESS_ROLES=controller,broker \
-e KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 \
-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \
-e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-server:9093 \
-e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \
bitnami/kafka:latest
ٹیسٹ کوڈ کا استعمال کرتے ہوئے ٹیسٹ:
var conn = null
function main() {
LogReset(1)
var robotId = _G()
Log("当前实盘robotId:", robotId)
conn = Dial("kafka://localhost:9092/test_topic")
if (!conn) {
Log("通信失败!")
return
}
for (var i = 0; i < 10; i++) {
// 写入
var msg = "i: " + i + ", testQueue, robotA, robotId: " + robotId + ", time:" + _D()
conn.write(msg)
Log("向testQueue写入消息:", msg)
// 读取
Log("read:", conn.read(1000), "#FF0000")
Sleep(1000)
}
}
function onexit() {
conn.close()
Log("关闭conn")
}
آئیے دیکھتے ہیں کہ کس طرح ڈائل فنکشن میں کافکا پروٹوکول کا استعمال کرتے ہوئے پیغامات شائع کرنے اور سبسکرائب کرنے کے لئے۔
Dial("kafka://localhost:9092/test_topic")
اس پروٹوکول کے نام کے ساتھ شروع ہوتا ہے؛ اس کے بعد اس کے ایڈریس پر عمل کریں:localhost:9092
اس کے بعد "/" علامت کو وقفے کے طور پر استعمال کریں ، اس کے بعد سبسکرائب / پوسٹ تھیم لکھیں ، جہاں ٹیسٹ تھیم کو اس طرح ترتیب دیا گیا ہے۔test_topic
。
ٹیسٹ کے نتائج: