NetflixÄÚÈÝÆ½Ì¨¹¤³ÌÍŶÓÔËÐÐÓÉ΢·þÎñÉÏÖ´ÐеÄÈÎÎñµÄÒì²½±àÅÅÇý¶¯µÄ¶à¸öÒµÎñÁ÷³Ì¡£ÆäÖÐһЩÊdz¤ÆÚÔËÐеÄÁ÷³Ì£¬¿çÔ½¼¸Ìì¡£ÕâЩÁ÷³ÌÔÚ×¼±¸ºÃ±êÌâÁ÷ʽ´«Êä¸øÈ«ÇòµÄ¹ÛÖÚÉÏ·¢»Ó¹Ø¼ü×÷Óá£
ÕâЩÁ÷³ÌµÄ¼¸¸öʵÀýÊÇ£º
ÓÃÓÚÄÚÈÝÌáÈ¡µÄStudioºÏ×÷»ï°é¼¯³É
»ùÓÚIMFµÄÄÚÈÝÌáÈ¡ÎÒÃǵĺÏ×÷»ï°é
ÔÚNetflixÖÐÉèÖÃбêÌâµÄ¹ý³Ì
ÄÚÈÝÌáÈ¡¡¢±àÂëºÍ²¿Êðµ½CDN
´«Í³ÉÏ£¬ÕâЩÁ÷³ÌÖеÄһЩÒѾÒÔad-hoc·½Ê½Ê¹ÓÃpub/subµÄ×éºÏÀ´±àÅÅ£¬½øÐÐÖ±½ÓRESTµ÷Ó㬲¢Ê¹ÓÃÊý¾Ý¿âÀ´¹ÜÀí״̬¡£È»¶ø£¬Ëæ×Å΢·þÎñÊýÁ¿µÄÔö³¤ºÍ½ø³ÌµÄ¸´ÔÓÐÔÔö¼Ó£¬ÔÚûÓÐÖÐÑë±àÅÅÆ÷µÄÇé¿öÏ£¬»ñµÃ¶ÔÕâЩ·Ö²¼Ê½¹¤×÷Á÷µÄ¿É¼ûÐÔ±äµÃÀ§ÄÑ¡£
ÎÒÃǽ«Conductor¹¹½¨ÎªÒ»¸ö±àÅÅÒýÇæ£¬ÒÔÂú×ãÒÔÏÂÒªÇó£¬È¡³öÔÚÓ¦ÓóÌÐòÖÐÐèÒªµÄÑù°å£¬²¢Ìṩһ¸ö·´Ó¦Á÷£º
»ùÓÚÀ¶Í¼¡£»ùÓÚJSON DSLµÄÀ¶Í¼¶¨ÒåÖ´ÐÐÁ÷³Ì¡£
¸ú×ٺ͹ÜÀí¹¤×÷Á÷¡£
Äܹ»ÔÝÍ£¡¢»Ö¸´ºÍÖØÐÂÆô¶¯½ø³Ì¡£
Äܹ»À©Õ¹µ½Êý°ÙÍò¸ö²¢·¢ÔËÐеĽø³ÌÁ÷¡£
ÓÉ´Ó¿Í»§¶Ë³éÏóµÄÅŶӷþÎñÖ§³Ö¡£
Äܹ»Í¨¹ýHTTP»òÆäËû´«Ê䷽ʽ½øÐвÙ×÷£¬Èç gRPC¡£
ConductorÊÇΪÂú×ãÉÏÊöÐèÇó¶ø¿ª·¢µÄ£¬²¢ÇÒÔÚNetflixÒѾʹÓÃÁ˽«½üÒ»Äê¡£µ½Ä¿Ç°ÎªÖ¹£¬ËüÒѾ°ïÖú±àÅų¬¹ý260Íò¸öÁ÷³ÌÁ÷£¬´Ó¼òµ¥µÄÏßÐÔ¹¤×÷Á÷µ½ÔËÐжàÌìµÄ·Ç³£¸´ÔӵĶ¯Ì¬¹¤×÷Á÷¡£
½ñÌ죬ÎÒÃÇΪ¹ã·ºµÄÉçÇø¿ªÔ´ÁË Conductor£¬Ï£Íû´ÓÓÐÀàËÆÐèÇóµÄÈËÄÇÀïѧϰ£¬²¢ÔöÇ¿ÆäÄÜÁ¦¡£Äã¿ÉÒÔÔÚÕâÀïÕÒµ½ConductorµÄ¿ª·¢Îĵµ¡£
Ϊʲô²»Êǵã¶Ôµã±àÅÅ£¿
Ëæ×ŵã¶ÔµãÈÎÎñ±àÅÅ£¬ÎÒÃÇ·¢ÏÖÔ½À´Ô½¶àµÄÒµÎñÐèÇóºÍ¸´ÔÓÐÔÄÑÒÔÀ©Õ¹¡£Pub/subÄ£Ð͹¤×÷µÄ×î¼òµ¥µÄÁ÷³Ì£¬µ«ºÜ¿ìÇ¿µ÷ÁËÓë¸Ã·½·¨Ïà¹ØµÄһЩÎÊÌ⣺
Á÷³ÌÁ÷¡°Ç¶È롱¶à¸öÓ¦ÓóÌÐò´úÂëÖС£
ͨ³£Çé¿öÏ£¬ÓйØÓÚÊäÈë/Êä³ö£¬SLAµÈµÄ½ôñîºÏºÍ¼ÙÉ裬ʹÆä¸üÄÑÊÊÓ¦²»¶Ï±ä»¯µÄÐèÇó¡£
¼¸ºõûÓа취ϵͳµØ»Ø´ð¡°What is remaining for a movie's setup to
be complete¡±£¿
ΪʲôÊÇ΢·þÎñ£¿
ÔÚ΢·þÎñÊÀ½çÖУ¬Ðí¶àÒµÎñÁ÷³Ì×Ô¶¯»¯ÊÇͨ¹ý¿ç·þÎñ±àÅÅÀ´Çý¶¯µÄ¡£Conductor¿ÉÒÔ¿ç·þÎñʵÏÖ±àÅÅ£¬Í¬Ê±Ìṩ¶ÔÆä½»»¥µÄ¿ØÖƺͿɼûÐÔ¡£¾ßÓбàÅÅ¿ç΢·þÎñµÄÄÜÁ¦Ò²°ïÖúÎÒÃÇÀûÓÃÏÖÓзþÎñÀ´¹¹½¨ÐÂÁ÷»ò¸üÐÂÏÖÓÐÁ÷£¬ÒÔ±ã·Ç³£Ñ¸ËÙµØÊ¹ÓÃConductor£¬ÓÐЧµØÌṩÁËÒ»¸ö¸üÈÝÒ×µÄ;¾¶¡£
Ìåϵ½á¹¹¸ÅÊö

ÒýÇæµÄºËÐÄÊÇ״̬»ú·þÎñ£¬Ò²³ÆÎª¾ö²ßÕß·þÎñ¡£µ±¹¤×÷Á÷ʼþ·¢Éúʱ£¨ÀýÈçÈÎÎñÍê³É¡¢Ê§°ÜµÈ£©£¬¾ö²ßÆ÷½«¹¤×÷Á÷À¶Í¼Ó빤×÷Á÷µÄµ±Ç°×´Ì¬×éºÏ£¬Ê¶±ðÏÂһ״̬£¬²¢±àÅÅÊʵ±µÄÈÎÎñºÍ/»ò¸üй¤×÷Á÷µÄ״̬¡£
¾ö²ßÕßʹÓ÷ֲ¼Ê½¶ÓÁÐÀ´¹ÜÀíÔ¤¶¨ÈÎÎñ¡£ ÎÒÃÇÒ»Ö±ÔÚDynomiteÉÏʹÓö¯Ì¬¶ÓÁÐÀ´¹ÜÀí·Ö²¼Ê½ÑÓ³Ù¶ÓÁС£¶ÓÁÐÅä·½ÊǽñÄêÔçЩʱºò¿ªÔ´µÄ£¬ÕâÀïÊDz©¿ÍÎÄÕ¡£
ÈÎÎñ¹¤×÷Á÷µÄʵÏÖ
Óɹ¤×÷Ó¦ÓóÌÐòʵÏÖµÄÈÎÎñͨ¹ýAPI²ã½øÐÐͨÐÅ¡£¹¤×÷³ÌÐòͨ¹ý¿ÉÓɱàÅÅÒýÇæµ÷ÓõÄREST¶Ëµã»òÕßͨ¹ýʵÏÖ¶¨ÆÚ¼ì²é¹ÒÆðÈÎÎñµÄÂÖѯѻ·À´ÊµÏÖÕâÒ»µã¡£¹¤×÷³ÌÐòÖ¼ÔÚʵÏÖÃݵȵÄÎÞ״̬¹¦ÄÜ¡£ÂÖѯģÐÍÔÊÐíÎÒÃÇ´¦Àí¹¤×÷³ÌÐòµÄ±³Ñ¹£¬²¢ÔÚ¿ÉÄÜʱ»ùÓÚ¶ÓÁÐÉî¶ÈÌṩ×Ô¶¯¿ÉÉìËõÐÔ¡£ConductorÌṩAPIÀ´¼ì²éÿ¸ö¹¤×÷¸ºÔصĴóС£¬¿ÉÓÃÓÚ×Ô¶¯±àÅŹ¤×÷³ÌÐòʵÀý¡£

¹¤×÷³ÌÐòÓëÒýÇæµÄͨÐÅ
API²ã
APIͨ¹ýHTTP¹«¿ª£ºÔÊÐíʹÓÃHTTPÇáËɼ¯³É²»Í¬µÄ¿Í»§¶Ë¡£È»¶ø£¬Ìí¼ÓÁíÒ»¸öÐÒ飨ÀýÈçgRPC£©Ó¦¸ÃÊÇ¿ÉÄܵ쬶øÇÒÒ²Ïà¶ÔÖ±½Ó¡£
´¢´æ
ÎÒÃÇʹÓÃDynomite¡°×÷Ϊ´æ´¢ÒýÇæ¡±ÒÔ¼°ElasticsearchÓÃÓÚË÷ÒýÖ´ÐÐÁ÷¡£´æ´¢APIÊǿɲåÈëµÄ£¬ÊÊÓÃÓÚ¸÷Öִ洢ϵͳ£¬°üÀ¨´«Í³µÄRDBMS»òApache
Cassandra£¬ÈçNoSQL´æ´¢¡£
¹Ø¼ü¸ÅÄî
¹¤×÷Á÷¶¨Òå
¹¤×÷Á÷ÊÇʹÓûùÓÚJSONµÄDSLÀ´¶¨Òå¡£¹¤×÷Á÷À¶Í¼¶¨ÒåÁËÐèÒªÖ´ÐеÄһϵÁÐÈÎÎñ¡£Ã¿¸öÈÎÎñÊÇ¿ØÖÆÈÎÎñ£¨ÀýÈ磺fork¡¢join¡¢decision¡¢sub
workflowµÈ£©»ò¹¤×÷ÕßÈÎÎñ¡£¹¤×÷Á÷¶¨ÒåÊǰ汾¿ØÖƵģ¬ÌṩÁ˹ÜÀíÉý¼¶ºÍÇ¨ÒÆµÄÁé»îÐÔ¡£
Ò»¸ö¹¤×÷Á÷¶¨ÒåµÄ¸ÅÒª£º
{ "name": "workflow_name", "description": "Description of workflow", "version": 1, "tasks": [ { "name": "name_of_task", "taskReferenceName": "ref_name_unique_within_blueprint", "inputParameters": { "movieId": "${workflow.input.movieId}", "url": "${workflow.input.fileLocation}" }, "type": "SIMPLE", ... (any other task specific parameters) }, {} ... ], "outputParameters": { "encoded_url": "${encode.output.location}" } } |
ÈÎÎñ¶¨Òå
ÿ¸öÈÎÎñµÄÐÐΪÓÉÆä³ÆÎªÈÎÎñ¶¨ÒåµÄÄ£°å¿ØÖÆ¡£ÈÎÎñ¶¨ÒåΪÿ¸öÈÎÎñÌṩ¿ØÖƲÎÊý£¬ÀýÈ糬ʱ¡¢ÖØÊÔ²ßÂԵȡ£ÈÎÎñ¿ÉÒÔÊÇÓÉÓ¦ÓóÌÐòʵÏֵŤ×÷ÈÎÎñ»òÓɱàÅÅ·þÎñÆ÷Ö´ÐеÄϵͳÈÎÎñ¡£ConductorÌṩ¿ªÏä¼´ÓõÄϵͳÈÎÎñ£¬ÈçDecision¡¢Fork¡¢Join¡¢Sub
WorkflowsºÍÔÊÐí²åÈë×Ô¶¨ÒåϵͳÈÎÎñµÄSPI¡£ÎÒÃÇÌí¼ÓÁ˶ÔHTTPÈÎÎñµÄÖ§³Ö£¬ÒÔ±ãÓÚµ÷ÓÃREST·þÎñ¡£
Ò»¸öÈÎÎñ¶¨ÒåµÄJSON´úÂë¶Î£º
{ "name": "encode_task", "retryCount": 3, "timeoutSeconds": 1200, "inputKeys": [ "sourceRequestId", "qcElementType" ], "outputKeys": [ "state", "skipped", "result" ], "timeoutPolicy": "TIME_OUT_WF", "retryLogic": "FIXED", "retryDelaySeconds": 600, "responseTimeoutSeconds": 3600 } |
ÊäÈë/Êä³ö
ÈÎÎñµÄÊäÈëÊǾßÓÐ×÷Ϊ¹¤×÷Á÷ʵÀý»¯»òһЩÆäËûÈÎÎñµÄÊä³öµÄÒ»²¿·ÖµÄÊäÈëµÄÓ³Éä¡£ÕâÖÖÅäÖÃÔÊÐí½«À´×Ô¹¤×÷Á÷»òÆäËûÈÎÎñµÄÊäÈë/Êä³ö×÷ΪÊäÈë·Óɵ½¿ÉÒÔ¶ÔÆä½øÐвÙ×÷µÄÈÎÎñ¡£ÀýÈ磬¿ÉÒÔ½«±àÂëÈÎÎñµÄÊä³öÌṩ¸ø·¢²¼ÈÎÎñ×÷Ϊ²¿Êðµ½CDNµÄÊäÈë¡£
ÓÃÓÚ¶¨ÒåÈÎÎñÊäÈëµÄJSON´úÂë¶Î£º
{ "name": "name_of_task", "taskReferenceName": "ref_name_unique_within_blueprint", "inputParameters": { "movieId": "${workflow.input.movieId}", "url": "${workflow.input.fileLocation}" }, "type": "SIMPLE" } |
Ò»¸öÀý×Ó
ÈÃÎÒÃÇ¿´¿´Ò»¸ö·Ç³£¼òµ¥µÄ±àÂëºÍ²¿Êð¹¤×÷Á÷£º

×ܹ²ÓÐ3¸ö¹¤×÷ÈÎÎñºÍÒ»¸ö¿ØÖÆÈÎÎñ£¨´íÎó£©Éæ¼°µ½£º
ÄÚÈݼì²é£ºÔÚÊäÈëλÖüì²éÎļþµÄÕýÈ·ÐÔ/ÍêÕûÐÔ¡£
±àÂ룺Éú³ÉÊÓÆµ±àÂë¡£
·¢²¼£º·¢²¼µ½CDN¡£
ÕâÈý¸öÈÎÎñÓɲ»Í¬µÄ¹¤×÷³ÌÐòʵÏÖ£¬ÕâЩ¹¤×÷³ÌÐòʹÓÃÈÎÎñAPIÂÖѯ´ý¾öÈÎÎñ¡£ÕâЩÊÇÀíÏë״̬µÄÃݵÈÈÎÎñ£¬ËüÃǶԸøÓèÈÎÎñµÄÊäÈë½øÐвÙ×÷£¬Ö´Ðй¤×÷£¬²¢ÇÒ½«×´Ì¬¸üлØÀ´¡£
ÿ¸öÈÎÎñÍê³Éºó£¬¾ö²ß³ÌÐò¸ù¾ÝÀ¶Í¼ÆÀ¹À¹¤×÷Á÷ʵÀýµÄ״̬£¨¶ÔÓ¦ÓÚ¹¤×÷Á÷ʵÀýµÄ°æ±¾£©²¢±êʶҪ±àÅŵÄÏÂÒ»×éÈÎÎñ£¬»òÕßÈç¹ûËùÓÐÈÎÎñÍê³É£¬ÔòÍê³É¹¤×÷Á÷¡£
UI
UIÊÇ¼à¿ØºÍ¹ÊÕÏÅųý¹¤×÷Á÷³ÌÖ´ÐеÄÖ÷Òª»úÖÆ¡£UIͨ¹ýÔÊÐí»ùÓÚ¸÷ÖÖ²ÎÊýµÄËÑË÷À´Ìṩ¶Ô¹ý³ÌµÄ·Ç³£ÐèÒªµÄ¿É¼ûÐÔ£¬°üÀ¨ÊäÈë/Êä³ö²ÎÊý£¬²¢ÌṩÁËÀ¶Í¼µÄ¿ÉÊÓ»¯³ÊÏÖ¼°ÆäËù²ÉÈ¡µÄ·¾¶£¬ÒÔ¸üºÃµØÁ˽âÁ÷³ÌÖ´ÐС£¶ÔÓÚÿ¸ö¹¤×÷Á÷ʵÀý£¬UIÌṩÿ¸öÈÎÎñÖ´ÐеÄÏêϸÐÅÏ¢£¬¾ßÓÐÒÔÏÂÏêϸÐÅÏ¢£º
ÈÎÎñ±àÅŵÄʱ¼ä´Á£¬Óɹ¤×÷³ÌÐò¼°Íê³ÉʱµÃµ½¡£
Èç¹ûÈÎÎñʧ°Ü£¬Ê§°ÜµÄÔÒò¡£
ÖØÊÔ³¢ÊÔ´ÎÊý¡£
Ö´ÐÐÈÎÎñµÄÖ÷»ú¡£
Ìṩ¸øÈÎÎñµÄÊäÈëºÍÍê³ÉºóÈÎÎñµÄÊä³ö¡£
ÕâÀïÊÇÒ»¸öÀ´×Ô³ø·¿Ë®²Û¹¤×÷Á÷³ÌµÄUIƬ¶Î£¬ÓÃÓÚÉú³ÉÐÔÄÜÊý¾Ý£º

ÆäËû½â¾ö·½°¸
Amazon SWF
ÎÒÃÇ´ÓʹÓÃAWSµÄ¼òµ¥¹¤×÷Á÷³ÌµÄÔçÆÚ°æ±¾¿ªÊ¼¡£È»¶ø£¬ÎÒÃÇÑ¡Ôñ¹¹½¨Conductor¸ø³öÁËSWFµÄһЩÏÞÖÆ£º
ÐèÒª»ùÓÚÀ¶Í¼µÄ±àÅÅ£¬¶ø²»ÊÇSWFÒªÇóµÄ³ÌÐò»¯¾ö²ßÕß¡£
Á÷Á¿µÄ¿ÉÊÓ»¯UI¡£
ÐèÒª¸ü¶àµÄͬ²½ÐÔÖʵÄAPI£¨¶ø²»ÊÇ´¿´â»ùÓÚÏûÏ¢£©¡£
ÐèҪΪ¹¤×÷Á÷ºÍÈÎÎñ½¨Á¢Ë÷ÒýÊäÈëºÍÊä³ö£¬ÒÔ¼°»ùÓÚ´ËÀ´- ËÑË÷¹¤×÷Á÷µÄÄÜÁ¦¡£
ÐèҪά»¤µ¥¶ÀµÄÊý¾Ý´æ´¢£¬ÒÔ±£´æ¹¤×÷Á÷ʼþ£¬´Ó¹ÊÕÏ¡¢ËÑË÷µÈ»Ö¸´¡£
Amazon Step Function
×î½ü·¢²¼µÄAWS Step FunctionsÌí¼ÓÁËÎÒÃÇÔÚ±àÅÅÒýÇæÖÐѰÇóµÄһЩ¹¦ÄÜ¡£ConductorÓпÉÄܲÉÓÃAmazon
States LanguageÀ´¶¨Ò幤×÷Á÷³Ì¡£
һЩͳ¼Æ
ÏÂÃæÊÇһЩÎÒÃÇÒѾÔËÐÐÁËÒ»Äê¶àµÄÉú²úʵÀýµÄͳ¼ÆÊý¾Ý¡£ÕâЩ¹¤×÷Á÷ÖеĴó¶àÊý±»ÄÚÈÝÆ½Ì¨¹¤³ÌÓÃÓÚÖ§³ÖÓÃÓÚÄÚÈÝ»ñÈ¡¡¢ÉãÈ¡ºÍ±àÂëµÄ¸÷ÖÖÁ÷¡£

δÀ´µÄ¿¼ÂÇ
Ö§³ÖAWS Lambda£¨»òÀàËÆ£©º¯Êý×÷ΪÎÞ·þÎñÆ÷¼òµ¥ÈÎÎñµÄÈÎÎñ¡£
ÓëÈÝÆ÷±àÅÅ¿ò¼Ü¸ü½ôÃܵɣ¬Õ⽫ÔÊÐí¹¤×÷ʵÀý×Ô¶¯À©Õ¹¡£
¼Ç¼ÿ¸öÈÎÎñµÄÖ´ÐÐÊý¾Ý¡£ÎÒÃÇÈÏΪÕâÊÇÒ»¸öÓÐÓõIJ¹³ä£¬ÓÐÖúÓÚÅųý¹ÊÕÏ¡£
Äܹ»´ÓUI´´½¨ºÍ¹ÜÀí¹¤×÷Á÷³ÌµÄÀ¶Í¼¡£
Ö§³Ö Amazon States Language¡£
|