整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          為什么經常說Node.js不適合大型應用

          先要明確什么是大型應用,其實這是仁者見仁、智者見智的問題,并且它是一個哲學問題,不是一個技術問題。假如有人問你,一個可以進行線上銷售的網站,比如優衣庫,大不大?你可能會說大,因為這與你平常所見的博客、企業官網等邏輯相比較確實復雜很多。或者說小,那么說明你開發過比它還復雜的系統。那么相比較淘寶而言呢?大和小的對比是要有參照物的。

          1. 應用的組成

          一個完備的 Web 應用可能只由一門語言或者一種技術構成嗎?不可能。因為一個完備的 Web 應用其實是多門技術的綜合體,解決某個問題有非常多的解決方案,比如后端的邏輯解決方案就非常多,Java、PHP、Python、Ruby 等都可以。

          簡單地概述,應用的組成內容可能包括:

          • Web 界面顯示邏輯;
          • 后端業務邏輯;
          • 緩存;
          • 數據庫;
          • 消息隊列。

          其實還可以加入日志分析、數據分析等,只是上面幾個最廣為人知而已。

          2. 應用的種類

          • I/O 密集型;
          • CPU 密集型。

          就常見的互聯網產品而言,它的瓶頸并非在后端業務的邏輯上,而是在 I/O 上,即返回給用戶看的數據的讀入與輸出。相對于應用程序而言,讀入指的是從數據庫里獲取數據,而輸出指的是將這些數據經過一定的處理輸出到用戶的瀏覽器,那么這就是 I/O 密集型。

          而 CPU 密集型是指做頻繁計算任務的應用,Node.js 在這方面確實是短板。

          3. 應用服務的過程

          如圖所示,用戶通過瀏覽器發送請求,由網卡接收TCP 連接,通知內核,內核再去調用相對應的服務端程序。

          Request 請求過程

          Response 返回過程

          如下圖,Web 應用要返回數據,首先要獲取數據,通過內核調用磁盤的驅動程序,把數據讀入緩存,這樣就可以在 Web 應用程序中獲取數據并進行數據處理,最終調用內核,將數據通過網卡發送給客戶端。

          4. 應用的瓶頸

          通常 I/O 密集型的瓶頸會在磁盤的讀寫上,所以在購買云服務器的時候可以購買 SSD 的磁盤來提升性能,一般數據庫軟件的數據都是存儲在文件上面的。首先考慮添加內存型緩存來解決這個瓶頸,緩存經常訪問的數據,看能否解決當前場景的問題,比如使用 Redis。其次才考慮搭建或擴充數據庫集群來提高并發。

          而 CPU 密集型的應用瓶頸則在 CPU 上,只能增加 CPU 處理核心來解決瓶頸。

          5. 分布式應用

          大型的普通應用與分布式應用其實是不同的概念。讀者可以把分布式應用簡單地理解為一個團隊,每一個成員都是一個節點,一個大的項目要讓成員合作完成,那么成員與成員之間就存在一些溝通成本,甚至有的成員與成員之間勾心斗角,說話陽奉陰違、推脫責任,也有可能成員生病在家休養,無法工作,等等。在面對這些問題的時候,Node.js 的優勢并不能很好地顯現出來(并非不可以做,只是沒有完善的基礎設施)。

          分布式的真正定義是,在多臺不同的服務器中部署不同的服務模塊,以進程為基本單位,派發到服務器上,通過遠程調用(RPC)通信并協同工作,最終對外提供服務。

          相比較 Node.js目前的分布式基礎設施,Go 語言的基礎設施則完善多了,特別是在 Docker 這個項目上,充分證明了 Go 語言的優勢,這也是為什么 Node.js 社區“大?!盩J Holowaychuk 轉向 Go 語言,因為他要開發分布式應用。

          其實沒必要過分地關心分布式的問題,畢竟 JavaScript 最初只是一個運行在瀏覽器端的腳本語言而已,JavaScript 不是萬能的,為什么一定要把它用在操作系統級別的開發上呢?尋找一個更合適的語言不是更好嗎?就像此刻我們選擇 JavaScript 構建 Web 應用一樣。

          6. 多進程的 Node.js

          了解了以上的一些知識點,現在讀者應該知道,Node.js 跟大型應用關系不大。大多數學習 Node.js 的開發者是前端開發者,所以對后端的基礎知識并不了解,在網絡上搜尋一些資料的時候發現 Node.js 只能利用單核,而又聽說 TJ Holowaychuk 轉向 Go 的陣營,所以有的開發者就產生了Node.js不適合開發大型應用的疑問。

          Node.js 只能利用單核的問題已經被解決了,后面使用的 Egg.js 框架中的 Egg-Cluster 模塊就利用多進程非常好地解決了這個問題。


          本文選自《Node.js實戰:使用Egg.js+Vue.js+Docker構建漸進式、可持續集成與交付應用》,作者yugo,電子工業出版社9月出版。了解詳情請點擊擴展鏈接。

          開phpstudy環境,點擊管理phpmyadmin,會出現錯誤,原因是我們把他的入口占用了,解決辦法也簡單。首先把phpmyadmin卸載了,重新安裝,選擇創建新站點:

          域名為127.0.0.1,端口改為33(自定義),根目錄需要先去E盤新建名為mysql的文件夾,瀏覽并選中即可,然后確認安裝

          接著我們再點擊管理phpmyadmin,就會出現這個頁面,默認賬號和密碼都是root:

          接著創建數據庫,如:tblog

          接著新建數據表并執行,如:t_user(表示我們的后臺管理用戶),字段數為3

          分別創建id,name,password(編號,用戶名,用戶密碼);類型依次為INT,VARCHAR,VARCHAR;長度依次為11,32,32;注意id需要選擇自增A_I。

          接著點擊下方的控制臺,輸入以下代碼,添加一行初始化數據,按Ctrl+Enter鍵執行:

          INSERT INTO `t_user` (`id`, `name`, `password`) VALUES ('1', 'admin', '123456');

          出現這樣就表示執行成功:

          點擊t_user就能看到我們添加的一行數據:

          好了,下節課程將教同學們怎樣連接數據庫并讀取出來

          先附上 github 地址

          https://github.com/AlaSQL/alasql

          AlaSQL.js - JavaScript SQL database for browser and Node.js. Handles both traditional relational tables and nested JSON data (NoSQL). Export, store, and import data from localStorage, IndexedDB, or Excel. -- 來自官網介紹

          AlaSQL.js 是一個 JavaScriptSQL 庫,它允許你使用 SQL 語句來查詢 JavaScript 對象。

          它不依賴于任何數據庫,因此可以在任何支持 JavaScript 的環境中運行,包括瀏覽器和 Node.js

          AlaSQL.js 支持多種數據源,如數組、對象、本地文件、Excel、CSV 等,并且可以與現有的 JavaScript 代碼無縫集成。

          AlaSQL.js 具有以下優點:

          • ? 輕量級AlaSQL.js 體積小,加載速度快。
          • ? 易于使用:如果你熟悉 SQL,那么使用 AlaSQL.js 會非常自然。
          • ? 兼容性:支持多種數據源,易于與現有代碼集成。
          • ? 功能豐富:支持 SQL 的大部分功能,如聯接、子查詢、聚合函數等。
          • ? 跨平臺:可以在瀏覽器和 Node.js 中使用。

          基本使用

          使用 AlaSQL.js 的基本步驟如下:

          安裝: 通過 npm 安裝 AlaSQL.js。

          npm install alasql

          導入:JavaScript 文件中導入 AlaSQL.js。

          var alasql = require('alasql);

          定義數據源: 可以是數組、對象、本地文件等。

          var data = [{name: 'Alice', age: 21}, {name: 'Bob', age: 25}];

          執行 SQL 查詢:使用 SQL 語句來查詢或操作數據。

          var res = alasql('SELECT * FROM ?', [data]);
          console.log(res);

          各種數據源的操作

          基于數據源的不同形式,我們可以將AlaSQL.js的使用分為以下幾種類型

          1. 數組和對象數據源

          示例: 使用數組和對象作為數據源進行基本查詢和數據操作。

          // 以數組作為數據源
          var dataArray = [{name: 'Alice', age: 21}, {name: 'Bob', age: 25}];
          var resArray = alasql('SELECT * FROM ?', [dataArray]);
          
          // 以對象作為數據源
          var dataObject = {name: 'Alice', age: 21};
          var resObject = alasql('SELECT * FROM ?', [dataObject]);

          2. 從文件讀取數據

          示例:CSVExcel 文件讀取數據并執行查詢。

          // 從CSV文件讀取數據
          alasql('CREATE FILE FROM ?', ['./data.csv']);
          var csvData = alasql('SELECT * FROM data.csv');
          
          // 從Excel文件讀取數據
          alasql('CREATE FILE FROM ?', ['./data.xlsx']);
          var excelData = alasql('SELECT * FROM data.xlsx');

          3. 網絡數據源

          示例: 從網絡API獲取JSON數據并進行SQL查詢。

          fetch('https://api.example.com/data')
            .then(response => response.json())
            .then(data => {
              var res = alasql('SELECT * FROM ?', [data]);
              console.log(res);
            });

          4. 本地存儲

          示例: 使用 WebSQLIndexedDB 作為數據存儲并執行操作。

          // 使用WebSQL
          var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
          alasql('ATTACH DATABASE mydb AS mydb;');
          
          // 使用IndexedDB
          var store = db.transaction(['storeName'], 'readwrite').objectStore('storeName');
          var res = alasql('SELECT * FROM ?', [store]);

          5. 數據庫連接

          示例: 連接到遠程(當然,通常是本地)數據庫如 MySQLPostgreSQL

          // 連接到MySQL
          alasql('mysql://user:password@localhost:3306/mydb')
            .then(function(res) {
              var result = alasql('SELECT * FROM mytable');
              console.log(result);
            });
          
          // 連接到PostgreSQL
          alasql('postgres://user:password@localhost:5432/mydb')
            .then(function(res) {
              var result = alasql('SELECT * FROM mytable');
              console.log(result);
            });

          6. 導出和導入數據

          示例: 將查詢結果導出到 CSVJSON 文件,或從這些格式導入數據。

          // 導出到CSV
          alasql('SELECT * INTO CSV("output.csv", {headers:true}) FROM ?', [data]);
          
          // 從CSV導入
          var importedData = alasql('SELECT * FROM CSV("input.csv", {headers:true})');
          
          // 導出到JSON
          alasql('SELECT * INTO JSON("output.json") FROM ?', [data]);
          
          // 從JSON導入
          var importedJsonData = alasql('SELECT * FROM JSON("input.json")');

          7. 存儲過程和函數

          示例: 創建和使用存儲過程以及自定義函數。

          // 創建存儲過程
          alasql('CREATE PROCEDURE GetOlderPeople AS SELECT * FROM ? WHERE age > 25', [data]);
          
          // 調用存儲過程
          var olderPeople = alasql('CALL GetOlderPeople', [data]);
          
          // 創建自定義函數
          alasql.fn.doubleAge = function(age) { return age * 2; };
          var doubledAges = alasql('SELECT doubleAge(age) AS doubled FROM ?', [data]);

          總結

          AlaSQL.js 提供了在 JavaScript 環境中對 SQL 語句的全面支持,它幾乎能夠處理前端開發中所有常見的數據操作任務,這對于那些習慣于后端開發模式的開發者來說,無疑是一大福音。它讓開發者能夠用熟悉的SQL語言,輕松地處理JavaScript中的對象和數組,大大節省了學習成本。

          當然,在將 AlaSQL.js 應用于實際項目時,還是需要根據項目的具體情況,做出更適合項目和團隊的判斷,工具雖好,可不能濫用。

          – 歡迎點贊、關注、轉發、收藏【我碼玄黃】,gonghao同名


          主站蜘蛛池模板: 日韩精品一区二区三区中文字幕 | 国产成人综合一区精品| 亚洲精品一区二区三区四区乱码| 午夜一区二区免费视频| 污污内射在线观看一区二区少妇 | 一本大道在线无码一区| 精品福利一区二区三区| 欧洲精品一区二区三区在线观看 | 中文字幕亚洲乱码熟女一区二区| 亚洲精品精华液一区二区 | 国模精品视频一区二区三区| 久久久91精品国产一区二区| 日韩一区二区精品观看| 成人区人妻精品一区二区不卡| 久久国产视频一区| 精品国产一区二区三区久久| 国产精品 一区 在线| 亚洲国产精品一区二区三区久久| 国产免费私拍一区二区三区| 国产一区二区草草影院| 丝袜美腿一区二区三区| 亚洲精品精华液一区二区| 亚洲综合激情五月色一区| 日本无卡码一区二区三区| 亚洲一区二区三区在线| 亚洲福利电影一区二区?| 91精品国产一区二区三区左线| 久久精品视频一区二区三区| 国产精品一区二区久久不卡| 国产在线精品一区免费香蕉| 国模吧无码一区二区三区| 国模吧无码一区二区三区| 亚洲一区二区三区在线观看精品中文 | 视频一区在线免费观看| 男人的天堂亚洲一区二区三区| chinese国产一区二区| 日韩人妻无码一区二区三区综合部| 中文字幕一区二区区免| 国产suv精品一区二区33| 亚洲午夜在线一区| 国产人妖视频一区二区破除|