IoT & Azure – סיפור אהבה בקצב גבוה

8 במרץ 2015

תגיות: , , ,
אין תגובות

ים המידע שמסביב

העולם הדיגיטלי הולך ומתפתח סביבנו. מצד אחד יותר ויותר מכשירים מחוברים לאינטרנט, ומחוללים כמות הולכת וגדלה של מידע בתהליכים שונים ומשונים שרק אתמול לא חשבנו שהם אפשריים. מצד שני, המכשירים הללו רק הולכים ונהיים זולים יותר ופשוטים יותר לתפעול והתפוצה שלהם עולה – מה שגורם למידע נוסף להיווצר. שלשום המחשבים שלנו היוו את רוב המכשירים המחוברים לאינטרנט, אתמול המכשירים הניידים והסלולריים תפסו את הבכורה, אבל מחר העולם יתמלא במכשירי קצה קטנים וחכמים המסוגלים לחוש את הסביבה, ולהעביר המון נתונים בקצב גבוה אל הענן. מה עושים עם כל המידע הזה? איך אנחנו בתור מפתחים יכולים להפיק ממנו את המרב?

 

עולם ה- IoT מעניין אתכם? בואו לראות את הדברים שהוצגו כאן הלכה למעשה!      להרשמה: http://bit.ly/IoTCloudweb

פעם והיום

פעם, בשביל להתמודד עם עשרות אלפים, מאות אלפים ואפילו מיליונים של אירועים בשנייה היינו צריכים להיות חברת ענק עם משאבי ענק – להקים חוות שרתים, לקנות את השרתים, להתקין אותם, לתחזק אותם וכו' – וכמעט את כל התשלום הזה היינו צריכים לעשות מראש. היום, בעידן הענן, כל אחד יכול, בשניות, להרים מערך שרתים ככל העולה על רוחו ולעבד קצב אדיר של מידע. כמובן שעל כל הטוב הזה צריך לשלם, אך כעת התשלום מתבצע בצורת Pay-as-you-go – כלומר, אנו משלמים רק על כוח העיבוד שצרכנו בפועל ללא שום תשלום מראש וכך חסם הכניסה לתחום ה-Big Data יורד פלאים.

אז איך אנחנו מעבדים את כל המידע הזה? ועוד בקלות? הפלטפורמה של Microsoft Azure מציעה מספר רב של שירותים שעוזרים לנו לבצע עבודה זו בקלות. במאמר זה נתמקד בשניים מהשירותים הללו – Event Hubs ו-Stream Analytics.

Event Hubs

Event Hubs הם דרך פשוטה ויעילה להכניס לענן נתונים בקצב גבוה. מנגנוני תורים (Queue) קלאסיים כגון אלו שקיימים ב-Azure Service Bus (או MSMQ, RabbitMQ, ActiveMQ וכו') מתבססים על-כך שמספר רב של לקוחות (Clients) מתחרים ביניהם על גישה להודעות באותו תור, דבר המגביל את הסקלביליות של הפתרון מכיוון שבסופו של דבר המשאב המשותף (תור) מוגבל ויש צורך לסנכרן את הגישה אליו. בניגוד לכך, מנגנוני תורים שפועלים בתצורה של Commit Log כגון Event Hubs (או Apache Kafka) עובדים בצורה שונה. במקום משאב אחד משותף (Journal) שיש להתחרות על הגישה אליו, כל Client ניגש ל-Journal וקורא ממנו הודעות ללא שום תלות ב-Clients אחרים. הסקלביליות במקרה זו מושגת לא ע"י הגדלת כמות הלקוחות אלא ע"י חלוקה של ה-Journal לחלקים בלתי תלויים הנקראים Partitions כאשר הקריאה מכל Partition היא סדרתית בצורה היעילה ביותר האפשרית. ע"י שליטה בכמות ה-Partitions אנחנו יכולים להגדיל את הסקלביליות הרצויה ולקבל פתרון שהוא אמנם מוגבל יותר מבחינת האפשרויות (Feature Set) שלו, אבל מותאם יותר לביצועים גבוהים.

מנגנון ה-Event Hubs ממומש ב-Azure כחלק מה-Service Bus, וניתן לשלוח אליו הודעות באחד משני פרוטוקולים – Http REST API או לחילופין AMQP (בכל פלטפורמה שנבחר, ויש הרבה כאלה). קריאת ההודעות מתבצעת בפרוטוקול AMQP בלבד.

Stream Analytics

כעת, לאחר שהעלינו בהצלחה את המידע הרב לענן, עולה השאלה מה עושים עם כל המידע הזה. אחת האפשרויות שעומדות לרשותנו (אם כי בהחלט לא היחידה) היא שימוש ב-Stream Analytics – שירות של Azure המאפשר לנתח כמות רבה של מידע בצורה קלה יחסית תוך שימוש בשפת שאילתות המתבססת על שפת SQL המוכרת עם הרחבות לעיבוד על-פני זמן.

ניתן לחשוב על Stream Analytics כצינור אשר יודע:

1. לקבל כקלט אירועים ממספר רב של מקורות כגון Event Hubs ועוד.

2. לשלב ולעבד אותם לפי רצון המשתמש.

3. להוציא את הפלט הסופי כזרם של מידע לאחד מסוגי הפלטים הנתמכים (כגון Event Hub, Azure SQL ו-Blob Storage).

דוגמא

על-מנת להמחיש את השימוש ב-Event Hubs נדמה מערכת שמורכבת מהרבה חיישנים המבצעים קריאות רבות, ועלינו לקלוט ולעבד מהר את הקריאות הללו.

image

שלב 1 – יצירת ה-Event Hub

הערה – הצעדים הבאים מבוצעים באמצעות פורטל הניהול, אך בהחלט ניתן לבצעם באמצעות ה-Azure Management API או לחילופין באמצעות פקודות PowerShell.

תחילה ניצור Service Bus Namespace שיכיל את ה-Event Hubs שלנו.

image

לאחר מכן ניצור זוג Event Hubs, אחד בשם input ואחד בשם output, אשר ישכנו ב-Service Bus Namespace שיצרנו בצעד הקודם.

image

image

במסך הנ"ל נשים לב לפרמטרים הבאים:

1. Partition Count – כמות ה-Partitions אליהם יחולק ה-Event Hub (מינימום 8). פרמטר זה משפיע על ה-Scaling אותו נוכל להשיג בסופו של דבר ולא ניתן לשנותו לאחר יצירת ה-Event Hub.

2. Message Retention – כמה ימים יש לשמור הודעות אשר מגיעות ל-Event Hub (מספר בין 1 ל-7). מכיוון ש-Clients במודל השימוש של Commit Log אינן מתחרים זה עם זה על הודעות, הרי שהודעות לא נמחקות לאחר שהן נקראות אלא אך ורק לאחר תאריך תפוגה (Expiry) שאותו אנו מגדירים כאן.

נחזור על התהליך עבור ה-Output.

image

לצורך ההדגמה בלבד נשתמש ב-Security Policy הכללי של ה-Service Bus אבל בעולם האמתי נגדיר Security Policy נפרד לכל Event Hub עם ההרשאות המדויקות להם אנו נזדקק לצורך צמצום החשיפה האבטחתית של האפליקציה שלנו.

את המפתח לשם כך ניתן למצוא בטאב של Configure.

image

שלב 2 – שליחת הנתונים לענן

לצורך שליחת הנתונים בהדגמה ניצור Console Application. על-מנת להשתמש ב-Event Hub עלינו ראשית להוסיף חבילת NuGet בשם WindowsAzure.ServiceBus.

image

נגדיר את האובייקט שאותו נרצה לשלוח לענן.

public class SensorData

    {

        public string SensorId { get; set; }

        public double Value { get; set; }

    }

כמו כן, נתקין את החבילה Json.NET (Newtonsoft.Json) על-מנת שנוכל לקודד את המידע בתצורת Json בעת השליחה.

כעת נוכל ליצור מידע לשליחה לענן תוך שימוש ב-Service Bus SDK:

private EventData GenerateData(string sensorId, Random random)

{

    var sensorData = new SensorData

    {

        SensorId = sensorId,

        Value = random.NextDouble() * 100

    };

    string jsonString = JsonConvert.SerializeObject(sensorData);

    return new EventData(Encoding.UTF8.GetBytes(jsonString))

    {

        PartitionKey = sensorId

    };

}


EventHubClient client = EventHubClient.Create("input");

client.SendBatchAsync(GenerateData(id, random));

בדוגמת קוד זו אנו מגדירים את אופן החיבור ל-Service Bus בתוך קובץ ה-App.config:

<appSettings>

    <add key="Microsoft.ServiceBus.ConnectionString" value="Endpoint=sb://msdnilsample.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=...."/>

</appSettings>


הקוד המלא שמדמה שליחת הודעות ממספר רב של מכשירים במקביל ניתן להורדה בהמשך המאמר.

שלב 3 – הגדרת Stream Analytics

כעת לאחר ששלחנו את המידע לענן נרצה לנתח אותו ולשם כך נשתמש ב-Azure Stream Analytics. ברצוננו להגדיר עיבוד שיחשב את ממוצע הקריאות עבור כל מכשיר דוגם בכל חלון זמן של שנייה.

נכון למועד כתיבת המאמר שירות זה נמצא ב-Preview ולכן יש לגלוש לכתובת https://account.windowsazure.com/PreviewFeatures ולהפעיל שם את השירות עבור חשבון ה-Azure שבו נרצה לעשות שימוש.

ראשית נגדיר את ה-Stream Analytics:

image

כעת בתוך ה-Stream Analytics נגדיר כקלט את ה-Input Event Hub שיצרנו בשלב קודם. לצורך כך ניגש לטאב Inputs ונוסיף:

image

image

image

image

את אותו התהליך נעבור בטאב ה-Output עבור ה-Output Event Hub שיצרנו מקודם.

לאחר שהגדרנו את הקלט והפלט, נעבור לטאב ה-Query ונגדיר את העיבוד שברצוננו לבצע:

image

בשאילתה זו אנו בוחרים לחשב ממוצע של הערך שנשלח לענן עבור כל SensorId בחלונות זמן של שניה. מידע נוסף על שפת השאילתה ניתן למצוא כאן – https://msdn.microsoft.com/en-us/library/azure/dn834998.aspx.

השלב הבא הוא ללחוץ על Start בתחתית העמוד, וסיימנו. פשוט וקל. J

שלב 4 – קריאת ההודעות המעובדות והצגה למשתמש

כעת, מה שנותר לנו הוא לקרוא את הודעות הפלט ולהציג למשתמש. לצורך כך נשתמש בשיטה יעילה במיוחד לקריאת הודעות מה-Event Hub בשם Event Processor Host. SDK זה נותן לנו לקרוא הודעות מה-Event Hub תוך שהוא מנהל עבורנו את הקריאה מה-Partition-ים השונים בצורה סקלבילית ונוחה.

לצורך כך נתקין NuGet Package בשם Microsoft.Azure.ServiceBus.EventProcessorHost, ונכתוב את הקוד הבא:

public class OutputEventProcessor : IEventProcessor

{

    private Stopwatch _checkpointStopWatch;


    public Task OpenAsync(PartitionContext context)

    {

        // ...

    }


    public async Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)

    {

        foreach (EventData message in messages)

        {

            string jsonData = Encoding.UTF8.GetString(message.GetBytes());

            OutputData[] data = // ...

            foreach (OutputData outputpData in data)

            {

                // ...

            }

        }


        // ...

    }


    public async Task CloseAsync(PartitionContext context, CloseReason reason)

    {

        // ...

    }

}


class Program

{

    static void Main()

    {

        var eventHubConnectionString = ConfigurationManager.AppSettings["ServiceBusConnection"];

        var storageConnectionString = ConfigurationManager.AppSettings["StorageConnection"];

        var host = new EventProcessorHost(

            Environment.MachineName,    // Each host needs to be uniquely identified in a distributed scenario 

            "output",                   // Event hub name

            EventHubConsumerGroup.DefaultGroupName,  // Default consumer group

            eventHubConnectionString,   // Event hub connection string

            storageConnectionString);   // Storage account to hold host synchronization info


        host.RegisterEventProcessorAsync<OutputEventProcessor>().Wait();

        Console.WriteLine("Receiving. Press enter key to stop.");

        Console.ReadLine();

        host.UnregisterEventProcessorAsync().Wait();

    }

}

הקוד הנ"ל מקבל את הפלט של ה-Stream Analytics שהגדרנו מקודם ומבצע בו ככל העולה על רוחו, וכך השגנו את שרצינו – עיבוד פשוט ונוח של כמות רבה של מידע תוך סינון וביצוע חישובים שונים ככל שנדרש.

דוגמת הקוד השלמה ניתנת להורדה מכאן.

סיכום

העולם הדיגיטלי הולך ומתפתח סביבנו וכמות המידע הנוצרת בו עולה על כל דמיון. במאמר זה ראינו כיצד אנחנו יכולים בקלות וביעילות לעבד ב-Azure כמויות עצומות של מידע, ללא שום חומרה ותוך כדי השקעה מינימלית.

Event Hubs ו-Stream Analytics הם רק שניים מהמנגנונים ש-Azure מספקת עבור עולם ה-Big Data, ויש עוד מספר מנגנונים שווה להשקיע וללמוד להשתמש בהם כראוי.

עולם ה- IoT מעניין אתכם? בואו לראות את הדברים שהוצגו כאן הלכה למעשה!

אתם מוזמנים לשמוע את ערן לייב ולהצטרף אלינו לכנס מיוחד שיוקדש כולו לעולמות ה-IoT והענן. הכנס יתקיים ביום ב' 23.3.15 במתחם הסינמה סיטי בגלילות.

להרשמה: http://bit.ly/IoTCloudweb

 

הפוסט נכתב על ידי ערן סטילר, מוביל תחום הענן וארכיטקט תוכנה בכיר בחברת CodeValue. יועץ ומרצה במגוון אירועים. בעל ניסיון של למעלה מ – 10 שניה בתחום הפיתוח במגוון רחב של עולמות ושפות.

image

חברת CodeValue מובילה בשירותי תוכנה וביצוע פרויקטים, באמצעות בניית הגשר בין טכנולוגיות חדשניות וצרכים עסקיים ספציפיים, תוך הענקת חוויית משתמש ברמה הגבוהה ביותר. חברת CodeValue מבצעת בהצלחה פרויקטי פיתוח תוכנה במגוון פלטפורמות ומספקת ייעוץ תוכנה ופיתוח המותאם לצרכי הלקוח. חברת CodeValue מתמקדת במספר נושאים מרכזיים בעולם התוכנה, ביניהם ALM ו DevOps, מחשוב ענן, עולם ההתקנים הניידים, מענה אחוד וכולל לשווקי ה-UI/UX, פיתוח מערכות מידע ועוד. החברה מונה מעל 90 עובדים בהם מומחי טכנולוגיה בעלי ניסיון רב, הנחשבים מובילים בתחומם ומוכרים כסמכות מקצועית.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *