1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Tìm hiểu và hiện thực tính năng thu thập dữ liệu người dùng từ hệ thống moodle lms

27 1 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 27
Dung lượng 799,77 KB

Nội dung

lOMoARcPSD|22494962 ẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ẠI HỌC BÁCH KHOA KHOA KHOA HỌC & KỸ THUẬT MÁY TÍNH Tìm hiểu thực tính thu thập liệu người dùng từ hệ thống Moodle LMS HỆ IỀU HÀNH (CO2017) GVHD: SV thực hiện: Nguyễn Quang Hùng Phan Hải Hà - 2011134 Lê Nguyễn Huyền Thoại - 2012122 Vũ Hà Tuấn Phong - 1914644 Tp Hồ Chí Minh, Tháng 4/2022 lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính Mục lục Tìm hiểu Kafka 1.1 Kafka gì? 1.2 Một số khái niệm bản? 1.3 Vì lại sử dụng Kafka? 1.4 Ưu iểm nhược iểm 2 4 Tìm hiểu Moodle 2.1 Moodle gì? 2.2 Các tính Moodle 5 Hiện thực 3.1 ịnh nghĩa 3.2 Thu thập liệu 3.3 Demo 7 11 21 HỆ IỀU HÀNH (CO2017) Trang 1/26 lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính 1.1 Tìm hiểu Kafka Kafka gì? Kafka hệ thống message pub/sub phân tán (distributed messaging system) Bên pulbic liệu ược gọi produce, bên subscribe nhận liệu theo topic ược gọi consumer Kafka có khả truyền lượng lớn message theo thời gian thực, trường hợp bên nhận chưa nhận message ược lưu trữ lưu hàng ợi ổ ĩa bảo ảm an toàn ồng thời ược replicate cluster giúp phịng tránh liệu HỆ IỀU HÀNH (CO2017) Trang 2/26 lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính 1.2 Một số khái niệm bản? • Producer: Kafka lưu, phân loại message theo topic Sau tạo message, sử dụng producer ể publish message vào topic Dữ liệu ược gửi ển partition topic lưu trữ Broker • Consumer: Kafka sử dụng consumer ể subscribe vào topic, consumer ược ịnh danh group name Nhiều consumer ọc topic • Consumer Group: Consumer khơng xử lý ược tất tin nhắn từ Topic Kafka cho phép thiết lập nhiều Consumer hoạt ộng tạo thành nhóm Consumer ể xử lý tin nhắn Nó ược gọi Consumer Group • Message: ơn vị liệu Kafka ược gọi message (một message chß ơn giản mảng byte) Nếu tiếp cận Kafka từ góc nhìn sở liệu, nghĩ message tương ứng row record table • Topic: Nếu message tương ứng row (record) topic tương ứng table ể gom nhóm message loại Dữ liệu truyền Kafka ến Topic chò nh ã Partition: L ni lu tr d liu bên topic Một topic có hay nhiều partition Trên partition liệu lưu trữ cố ịnh ược gán cho ID gọi offset Trong Kafka cluster (gồm nhiều brocker) partition replicate (sao chép) nhiều copy ể tăng tính HA (High Availability) Trong ó có ược bầu leader chịu trách nhiệm ọc ghi liệu lại gọi follower chß thực ồng vời partition leader Khi leader bị lỗi có follower lên làm leader thay Nếu muốn dùng nhiều consumer ọc song song liệu topic topic ó cần phải phân chia liệu thành nhiều partition ặt brocker khác • Kafka Broker: Kafka server cài nhiều Kafka Node (server vật lý) Các broker hoạt ộng song song với ể quản lý liệu vào Các broker hoạt ộng ngang hàng với ược quản lý Zookeeper • Kafka cluster: tập hợp nhiều server vật lý - Kafka Node (hay nhiều broker) • Zookeeper: ược dùng ể quản lý bố trí broker Tồn thơng tin topic partitions cluster ều ược lưu Zookeeper Khi có kiện thêm broker, thay thể partition leader thơng tin Zookeeper giúp tồn broker cịn lại biết ược trạng cụm ể có iều chßnh phù hợp leader HỆ IỀU HÀNH (CO2017) Trang 3/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính 1.3 Vì lại sử dụng Kafka? Bởi dự án opensource nên Kafka ã ược óng gói hồn chßnh có khả chịu lỗi vơ cao Vì vậy, hiệu làm việc Kafka tốt mở rộng dễ dàng mà không cần dừng hệ thống lại - Nên sử dụng Kafka nào? • Khi cần thiết kế hệ thống publish-subcribe có khả mở rộng theo chiều ngang (horizontally scaling) • Khi cần kiến trúc truyền thông iệp thời gian thực nhanh, áng tin cậy chịu lỗi cao - Một số trường hợp cụ thể dùng Kafka kể ến • Website activity tracking • Metric collection and monitoring • Log aggregation • Real-time analytics • Replay message • Error recovery 1.4 Ưu iểm nhược iểm + Ưu iểm: • Khả mở rộng: mơ hình phân vùng lưu trữ tin nhắn Kafka cho phép liệu phân phối nhiều máy chủ qua ó mở rộng máy chủ muốn scale • Với cách xử lý tách luồng liệu, ộ trễ thấp làm cho tốc ộ trở nên nhanh • Khả chịu lỗi ộ bền: Dữ liệu ược chép phân phối nhiều server khác Vì thế, có cố xảy ra, liệu khơi phục (tính chịu lỗi bền vững hơn) + Nhược iểm: • Khơng ược xây dựng cho hàng chục nghìn kết nối • Yêu cầu mạng ổn ịnh sở hạ tầng tốt HỆ IỀU HÀNH (CO2017) Trang 4/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính 2.1 Tìm hiểu Moodle Moodle gì? Moodle mã nguồn mở PHP ược sử dụng hỗ trợ việc phát triển riêng cho hoạt ộng quản lý ào tạo, học tập trực tuyến Moodle bật thiết kế hướng tới giáo dục, dành cho người làm lĩnh vực giáo dục Ngồi ra, mã nguồn mở cịn ược sử dụng tổ chức lĩnh vực giáo dục HỆ IỀU HÀNH (CO2017) Trang 5/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính 2.2 Các tính Moodle Thiết kế hồn thiện, tổng thể: Sở hữu giao diện thân thiện, sử dụng ơn giản, dễ dàng phù hợp với nhiều người dùng khác Có thể áp dụng hiệu kết hợp lớp học online với lớp học truyền thống Các biểu mẫu ều ược kiểm tra tính hợp lệ, cookies mật mã ược mã hóa Quản lý trang Web sử dụng Moodle: Trang web ược Super Admin (ược cấp quyền quản trị trình cài ặt) quản lý Cung cấp nhiều tùy chọn plug-in, cho phép người quản trị tùy chßnh giao diện trang web như: màu, font chữ, bố cục, ngôn ngữ, code phụ thuộc theo nhu cầu Quản lý người dùng: Hỗ trợ quản lý người dùng phương thức khác thông qua plug-in ã ược xác thực hệ thống xác thực sẵn có Học viên chßnh sửa thơng tin cá nhân qua Moodle, ồng thời làm ẩn email không muốn công khai thông tin cá nhân Người dùng óng nhiều vai trị khác tùy vào tính chất lớp học admin ln có quyền quản lý chặt chẽ Quản lý khóa học Moodle: Các khóa học ều ược quản lý người dùng ược set vai trò Teacher (Giáo viên) ược tùy chßnh tùy vào khóa học Các hoạt ộng diễn lúc học như: làm tập, thuyết trình, kiểm tra, kết thi, ều ược ghi lại văn thống kê biểu ồ Học viên dễ dàng trao ổi thảo luận thông qua module Chat, tương tác với tảng mạng xã hội qua module Forum, sử dụng module Lesson, Quiz, Resource, Wiki, ể ứng dụng tài nguyên học tập Tài liệu Moodle dồi ồ sộ, áp ứng ược thắc mắc học viên HỆ IỀU HÀNH (CO2017) Trang 6/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính 3.1 Hiện thực ịnh nghĩa Folder Object chứa inh nghĩa liệu muốn lấy bao gồm Student, Teacher Course với class bổ trợ HỆ IỀU HÀNH (CO2017) Trang 7/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính • Class Course • Class Log • Class Quiz HỆ IỀU HÀNH (CO2017) Trang 8/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính • Class Student • Class StudentCourse • Class Teacher HỆ IỀU HÀNH (CO2017) Trang 9/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính courseId; Statement st = connection.createStatement(); ResultSet result = st.executeQuery(query); 55 56 57 while (result.next()) { int contextId = result.getInt("id"); 58 59 60 String query2 = "SELECT * FROM mdl_role_assignments WHERE roleid = AND contextid = " + contextId; Statement st2 = connection.createStatement(); ResultSet result2 = st2.executeQuery(query2); 61 62 63 64 while (result2.next()) total ++; 65 66 67 st2.close(); } st.close(); 68 69 70 71 return total; 72 } 73 74 public int getTotalAccessTime(int courseId) throws SQLException { int total = 0; String query = "SELECT * FROM mdl_logstore_standard_log WHERE action = ’viewed’ AND target=’course’ AND courseid = " + courseId; Statement st = connection.createStatement(); ResultSet result = st.executeQuery(query); 75 76 77 78 79 80 while (result.next()) total ++; st.close(); 81 82 83 84 return total; 85 } 86 87 public List getAllCourse() throws SQLException { List courses = new ArrayList(); String query = "SELECT * FROM mdl_course WHERE id > 1"; Statement st = connection.createStatement(); ResultSet result = st.executeQuery(query); 88 89 90 91 92 93 while (result.next()) { int courseId = result.getInt("id"); String courseName = result.getString("fullname"); int participants = this.getTotalEnrol(courseId); int totalStudent = this.getTotalStudentEnrol(courseId); int totalTeacher = this.getTotalTeacherEnrol(courseId); int totalAccess = this.getTotalAccessTime(courseId); 94 95 96 97 98 99 100 101 courses.add(new Course(courseId, courseName, participants, totalStudent, totalTeacher, totalAccess)); 102 } st.close(); return courses; 103 104 105 } 106 107 } HỆ IỀU HÀNH (CO2017) Trang 12/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính public class StudentModel extends Database { public StudentModel() { super(); } 10 public int getLoginTime(int userId) throws SQLException { int count = 0; String query = "SELECT * FROM mdl_logstore_standard_log WHERE userid = " + userId + " AND action = ’loggedin’"; Statement st = connection.createStatement(); ResultSet result = st.executeQuery(query); 11 while (result.next()) { count ++; } st.close(); 12 13 14 15 16 return count; 17 18 } 19 20 21 22 23 24 25 public List getAllLog(int userId) throws SQLException { List logs = new ArrayList(); String query = "SELECT * FROM ‘mdl_logstore_standard_log‘ WHERE ‘userid‘="+ userId + " AND (‘action‘=’loggedin’ OR ‘action‘=’loggedout’) ORDER BY ‘timecreated‘ ASC;"; Statement st = connection.createStatement(); ResultSet result = st.executeQuery(query); 26 while (result.next()) { // get loggedin value String id = result.getString("ip"); long loginTime = result.getLong("timecreated"); 27 28 29 30 31 //get loggedout value result.next(); long logoutTime = result.getLong("timecreated"); 32 33 34 35 logs.add(new Log(id, new Date(loginTime * 1000), new Date(logoutTime * 1000).getTime() - new Date(loginTime * 1000).getTime())); 36 37 38 } st.close(); 39 40 41 return logs; 42 43 } 44 45 46 47 public List getAllQuiz(int userId, int courseId) throws SQLException { List quizzes = new ArrayList(); List quizIds = new ArrayList(); 48 49 50 51 52 53 54 55 56 57 String query = "SELECT * FROM mdl_quiz WHERE course = " + courseId; Statement st = connection.createStatement(); ResultSet result = st.executeQuery(query); while (result.next()) { int id = result.getInt("id"); String name = result.getString("name"); quizIds.add(id + " " + name); } st.close(); 58 HỆ IỀU HÀNH (CO2017) Trang 13/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính for (String quizId : quizIds) { int id = Integer.parseInt(quizId.split(" ")[0]); String name = quizId.split(" ")[1]; 59 60 61 62 String query2 = "SELECT * FROM mdl_quiz_grades WHERE quiz = " + id + " AND userid = " + userId; Statement st2 = connection.createStatement(); ResultSet result2 = st2.executeQuery(query2); 63 64 65 66 while (result2.next()) { quizzes.add(new Quiz(id, name, result2.getDouble("grade"))); } 67 68 69 70 st2.close(); 71 } 72 73 return quizzes; 74 75 } 76 77 78 79 public List getStudentCourse(int userId) throws SQLException { List studentCourses = new ArrayList(); List courses = new CourseModel().getAllCourse(); 80 for (Course course : courses) { String query = "SELECT * FROM mdl_context WHERE contextlevel = 50 AND instanceid =" + course.getCourseId(); Statement st = connection.createStatement(); ResultSet result = st.executeQuery(query); 81 82 83 84 85 while (result.next()) { int contextId = result.getInt("id"); String query2 = "SELECT * FROM mdl_role_assignments WHERE roleid = AND contextid = " + contextId + " AND userid =" + userId; Statement st2 = connection.createStatement(); ResultSet result2 = st2.executeQuery(query2); 86 87 88 89 90 91 int size = 0; while (result2.next()) { size ++; } if (size > 0) studentCourses.add(new StudentCourse(course.getCourseId(), course.getCourseName(), this.getAccessTime(userId, course.getCourseId()), this.getAllQuiz(userId, course.getCourseId()))); st2.close(); 92 93 94 95 96 97 98 99 100 101 } 102 103 st.close(); 104 } 105 106 return studentCourses; 107 108 } 109 110 111 112 public List getAllStudent() throws SQLException { List students = new ArrayList(); List users = this.getAllUser(); 113 114 115 116 117 for (String user : users) { int userId = Integer.parseInt(user.split(" ")[0]); String userName = user.split(" ")[1]; int loginTime = this.getLoginTime(userId); HỆ IỀU HÀNH (CO2017) Trang 14/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính List loginLogs = this.getAllLog(userId); List courses = this.getStudentCourse(userId); 118 119 120 if (!courses.isEmpty()) students.add(new Student(userId, userName, loginTime, loginLogs, courses)); 121 122 } 123 124 return students; 125 } 126 127 } HỆ IỀU HÀNH (CO2017) Trang 15/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính public class TeacherModel extends Database { public TeacherModel() { super(); } 10 11 public List getAllLog(int userId) throws SQLException { List logs = new ArrayList(); String query = "SELECT * FROM ‘mdl_logstore_standard_log‘ WHERE ‘userid‘="+ userId + " AND (‘action‘=’loggedin’ OR ‘action‘=’loggedout’) ORDER BY ‘timecreated‘ ASC;"; Statement st = connection.createStatement(); ResultSet result = st.executeQuery(query); 12 while (result.next()) { // get loggedin value String id = result.getString("ip"); long loginTime = result.getLong("timecreated"); 13 14 15 16 17 //get loggedout value result.next(); long logoutTime = result.getLong("timecreated"); 18 19 20 21 logs.add(new Log(id, new Date(loginTime * 1000), new Date(logoutTime * 1000).getTime() - new Date(loginTime * 1000).getTime())); 22 23 24 } st.close(); 25 26 27 return logs; 28 29 } 30 31 32 33 public List getTeacherCourse(int userId) throws SQLException { List courses = new CourseModel().getAllCourse(); List teacherCourses = new ArrayList(); 34 35 36 37 38 for (Course course : courses) { String query = "SELECT * FROM mdl_context WHERE contextlevel = 50 AND instanceid =" + course.getCourseId(); Statement st = connection.createStatement(); ResultSet result = st.executeQuery(query); 39 while (result.next()) { int contextId = result.getInt("id"); String query2 = "SELECT * FROM mdl_role_assignments WHERE roleid = AND contextid = " + contextId + " AND userid =" + userId; Statement st2 = connection.createStatement(); ResultSet result2 = st2.executeQuery(query2); 40 41 42 43 44 45 int size = 0; while (result2.next()) { size ++; } if (size > 0) teacherCourses.add(new TeacherCourse(course.getCourseId(), course.getCourseName(), this.getAccessTime(userId, course.getCourseId()) )); st2.close(); 46 47 48 49 50 51 52 53 54 } 55 56 st.close(); 57 58 } HỆ IỀU HÀNH (CO2017) Trang 16/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính 59 return teacherCourses; 60 } 61 62 public List getAllTeacher() throws SQLException { List users = this.getAllUser(); List teachers = new ArrayList(); for (String user : users) { int userId = Integer.parseInt(user.split(" ")[0]); String userName = user.split(" ")[1]; List courses = this.getTeacherCourse(userId); List loginLog = this.getAllLog(userId); if (!courses.isEmpty()) teachers.add(new Teacher(userId, userName, loginLog, courses)); } 63 64 65 66 67 68 69 70 71 72 73 74 return teachers; 75 } 76 77 } HỆ IỀU HÀNH (CO2017) Trang 17/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính Ta sử dụng hàm Producer ể lấy liệu sau ó ưa liệu lấy ược ưa lên Apache Kafka Ta có CourseProducer ể lấy liệu Course public class CourseProducer extends Thread { public static void main(String[] args) throws IOException, SQLException, InterruptedException { CourseModel database = new CourseModel(); String topic = "Course"; Properties props = loadConfig(); createTopic(topic, props); props.put(ProducerConfig.ACKS_CONFIG, "all"); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer"); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "io.confluent.kafka.serializers.KafkaJsonSerializer"); 10 11 12 org.apache.kafka.clients.producer.Producer producer = new KafkaProducer(props); 13 14 // Produce sample data List courses = database.getAllCourse(); String key = "course"; 15 16 17 18 for (Course course:courses) { System.out.println(course.toString()); Thread.sleep(2000); producer.send(new ProducerRecord(topic, key, course), new Callback() { @Override public void onCompletion(RecordMetadata m, Exception e) { if (e != null) { e.printStackTrace(); } else { System.out.printf("Produced record to topic %s partition [%d] @ offset %d%n", m.topic(), m.partition(), m.offset()); } } }); } 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 producer.close(); 34 35 } 36 37 38 39 40 41 42 43 44 45 46 47 public static void createTopic(String topic, Properties cloudConfig) { final NewTopic newTopic = new NewTopic(topic, Optional.empty(), Optional.empty()); try (final AdminClient adminClient = AdminClient.create(cloudConfig)) { adminClient.createTopics(Collections.singletonList(newTopic)).all().get(); } catch (final InterruptedException | ExecutionException e) { // Ignore if TopicExistsException, which may be valid if topic exists if (!(e.getCause() instanceof TopicExistsException)) { throw new RuntimeException(e); } } } 48 49 50 51 52 53 public static Properties loadConfig() throws IOException { final Properties cfg = new Properties(); ClassLoader classloader = Thread.currentThread().getContextClassLoader(); try (InputStream inputStream = classloader.getResourceAsStream("java.config")) { cfg.load(inputStream); HỆ IỀU HÀNH (CO2017) Trang 18/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính } return cfg; 54 55 } 56 57 } HỆ IỀU HÀNH (CO2017) Trang 19/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính Tại Consumer, liệu ược ưa lên thực hàm liên quan dến việc vẽ ồ thị ể visualization thông tin thu ược 10 # Create Consumer instance conf = { ’bootstrap.servers’: ’pkc-ldvr1.asia-southeast1.gcp.confluent.cloud:9092’, ’group.id’: ’consumer-1’, ’security.protocol’: ’SASL_SSL’, ’sasl.mechanisms’: ’PLAIN’, ’sasl.username’: ’AE2H4XGOR6RJG7PJ’, ’sasl.password’: ’SnH9JKli5r51asOqjmeZKsJMHzfQeKi/SvXdvdJsrIi6bJo3MP7yMWSK/Ua1459a’ } consumer = Consumer(conf) 11 12 13 14 # Subscribe to topic topic = "Course" consumer.subscribe([topic]) 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 # Poll for new messages from Kafka and print them val = "" try: while True: msg = consumer.poll(2.0) if msg is None: # Initial message consumption may take up to # ‘session.timeout.ms‘ for the consumer group to # rebalance and start consuming print("Waiting ") elif msg.error(): print("ERROR: %s".format(msg.error())) else: # Extract the (optional) key and value, and print val += "{value:12}".format(value=msg.value().decode(’utf-8’)) + "," print("{value:12}".format(value=msg.value().decode(’utf-8’))) except KeyboardInterrupt: pass finally: # Leave group and commit final offsets if val != "": data = "{\"Course\":[" + val[:-1:] + "]}" write_json(data) consumer.close() Tương tự với Student Teacher có StudentProducer, StudentConsumer TeacherProducer, TeacherConsumer HỆ IỀU HÀNH (CO2017) Trang 20/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính 3.3 Demo Danh sách số sinh viên tương ứng với khóa học tổng số lần truy cập HỆ IỀU HÀNH (CO2017) Trang 21/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính Danh sách sinh viên tương ứng với iểm lần truy cập khóa học • HỆ IỀU HÀNH (CO2017) Trang 22/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính • HỆ IỀU HÀNH (CO2017) Trang 23/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính • HỆ IỀU HÀNH (CO2017) Trang 24/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính • HỆ IỀU HÀNH (CO2017) Trang 25/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com) lOMoARcPSD|22494962 Trường ại Học Bách Khoa Tp.Hồ Chí Minh Khoa Khoa Học & Kỹ Thuật Máy Tính • HỆ IỀU HÀNH (CO2017) Trang 26/26 Downloaded by Hoc Vu (vuchinhhp7@gmail.com)

Ngày đăng: 22/06/2023, 20:44

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w