Sử dụng streaming SQL với Node.js là cách để bạn có thể tra từng hàng của bảng trong cơ sở dữ liệu và thao tác trên đó.
Các cơ sở dữ liệu SQL nói chung rất tuyệt vời trong việc xử lý lượng dữ liệu khổng lồ. Mình không nghĩ rằng đó là một sự cường điệu khi nói rằng hầu hết các công ty mà mình thấy sử dụng Hadoop cho hầu hết “mọi” bài toán về xử lý dữ liệu. Trong khi sẽ tốt hơn và tiết kiệm chi phí hơn khi chỉ cần thêm một chỉ mục hoặc RAM bổ sung vào máy chủ Postgres / MySQL của họ. Bạn có thể thực hiện lọc và tổng hợp khá tốt trong SQL. Nhưng đôi khi, những tác vụ mạnh mẽ này không hỗ trợ những thứ bạn cần. Trong một số trường hợp bạn sẽ muốn xử lý từng hàng trong node.js
Lặp với Async
Hãy tưởng tượng trong bài toán này:
- Chúng ta có một database chứa một số lượng lớn IDs của Tweets từ Twitter. Ít nhất 100 ngàn.
- Chúng ta yêu cầu số lượng likes của mỗi tweet từ Twitter.
- Chúng ta muốn xử lý tác vụ này dưới nền và không ngốn quá nhiều bộ nhớ.
Chúng ta sẽ stream kết quả từ truy vấn của chúng ta để lấy ra từng hàng từ database. Ví dụ dưới đây sẽ hoạt động khá tốt, bất kể bạn muốn sử dụng @databases/pg
cho Postgres, @databases/mysql
cho MySQL hoặc @databases/sqlite
cho SQLite:
// thay thế để phù hợp với CSDL của bạn import connect, {sql} from '@databases/pg'; const db = connect(); export default async function updateTweets() { const tweets = db.queryStream( sql`SELECT id, likes FROM tweets;` ); for await (const tweet of tweets) { const likes = await getLikes(tweet.id); if (likes !== tweet.likes) { await db.query( sql` UPDATE tweets SET likes = ${likes} WHERE id = ${tweet.id}; ` ); } } }
Code này cần phải có phiên bản gần hoặc mới nhất của Node, hoặc sử dụng transpiler như là babel để hỗ trợ. Nó sẽ stream tweets từ CSDL, cho phép một buffer của một vài tweets trước khi bắt đầu làm chậm lại quá trình gửi dữ liệu. Một khi chúng ta nhận một tweet mới, và kết thúc quá trình xử lý tweet trước đó, chúng ta có thể xử lý nó.
Node.js Streams
Đây là phương án khác cho việc sử dụng streaming SQL với Node.js.
Tưởng tượng bạn cần xuất một bảng dữ liệu lớn ra file CSV để xử lý ở hệ thống khác. Ví dụ một phần mềm phân tích hoặc nhập dữ liệu vào một gói dịch vụ kế toán chẳng hạn. Bạn có thể chờ cho đến khi bạn lấy về hết tất cả các bản ghi, nhưng nó sẽ thuận tiên hơn khi chúng ta có thể bắt đầu gửi dữ liệu đi ngay khi nó sẵn sàng. Việc này thật sự hữu ích khi client tải tập tin về thông qua một kết nối internet chậm.
Ví dụ này cũng hoạt động tốt, bất kể là sử dụng @databases/pg
cho Postgres, @databases/mysql
cho MySQL. Tuy nhiên hiện tại thì nó chưa hỗ trợ SQLite.
// thay thế để phù hợp với CSDL của bạn import connect, {sql} from '@databases/pg'; import {Map} from 'barrage'; import stringify from 'csv-stringify'; const db = connect(); export default function getTweetsCSV() { const tweets = db.queryNodeStream( sql`SELECT id, likes FROM tweets;` ); const map = new Map(tweet => [tweet.id, tweet.likes]); const stringifier = stringify(); stringifier.write(['Tweet ID', 'Likes']); tweets.pipe(map).pipe(stringifier); tweets.on('error', e => stringifier.emit('error', e); map.on('error', e => stringifier.emit('error', e); return stringifier; }
Ở đây chúng ta yêu cầu tất cả tweets như một node.js Object Stream. Sau đó chúng ta phân phối stream đó vào một Map
stream. Cuối cùng chúng ta sẽ phân phối mapped stream này vào csv-stringifier stream. Nó sẽ nhận một mảng cho mỗi dòng và xuất ra file CSV. Chúng ta còn có thể phân phối nó qua createGzip
nếu client hỗ trợ gzip.
Kết luận
Lưu ý:
- 99% công việc hằng ngày bạn làm, bạn sẽ không muốn streaming. Nó làm cho code khó đọc và theo dõi hơn và hầu như là hiếm khi bạn cần lấy về tất cả dữ liệu của bảng một lúc để xử lý. Vì vậy hãy sử dụng khi thật cần thiết!
- Khi bạn muốn triển khai một tác vụ cần thay đổi mỗi hàng trong một bảng lớn, sử dụng vòng lặp với async (i.e.
.queryStream
) - Khi bạn muốn
- Khi bạn muốn tuần tự hóa từng hàng trong một bảng lớn thành định dạng chuỗi / nhị phân, hãy sử dụng phương pháp node.js stream (i.e.
.queryNodeStream
).
14 Tháng Hai, 2021, 11:34 chiều
9 Tháng Ba, 2021, 9:48 chiều
16 Tháng Ba, 2021, 6:13 sáng
17 Tháng Ba, 2021, 6:08 chiều
20 Tháng Ba, 2021, 6:21 sáng
27 Tháng Ba, 2021, 6:21 sáng
28 Tháng Ba, 2021, 6:14 sáng
31 Tháng Ba, 2021, 11:28 chiều
12 Tháng Tư, 2021, 6:41 chiều
23 Tháng Tư, 2021, 2:00 chiều
25 Tháng Tư, 2021, 10:43 sáng
2 Tháng Năm, 2021, 6:06 chiều
2 Tháng Năm, 2021, 6:56 chiều
6 Tháng Năm, 2021, 5:32 sáng
18 Tháng Năm, 2021, 3:12 sáng
19 Tháng Năm, 2021, 6:31 sáng
20 Tháng Năm, 2021, 6:36 sáng
31 Tháng Năm, 2021, 9:15 sáng
31 Tháng Năm, 2021, 6:42 chiều
1 Tháng Sáu, 2021, 1:51 chiều
5 Tháng Sáu, 2021, 7:33 chiều
26 Tháng Sáu, 2021, 8:08 chiều
28 Tháng Sáu, 2021, 8:23 sáng
1 Tháng Bảy, 2021, 1:01 sáng
3 Tháng Bảy, 2021, 5:39 sáng
3 Tháng Bảy, 2021, 9:54 sáng
3 Tháng Bảy, 2021, 5:40 chiều
3 Tháng Bảy, 2021, 6:14 chiều
3 Tháng Bảy, 2021, 7:19 chiều
7 Tháng Bảy, 2021, 6:42 sáng
16 Tháng Bảy, 2021, 5:49 sáng
25 Tháng Bảy, 2021, 10:13 sáng
30 Tháng Bảy, 2021, 10:46 sáng
30 Tháng Bảy, 2021, 11:26 chiều
17 Tháng Ba, 2022, 4:04 chiều
This is a good tip particularly to those fresh to
the blogosphere. Simple but very accurate info… Many thanks for sharing this one.
A must read article!
17 Tháng Chín, 2022, 11:09 sáng
I’m writing on this topic these days, safetoto, but I have stopped writing because there is no reference material. Then I accidentally found your article. I can refer to a variety of materials, so I think the work I was preparing will work! Thank you for your efforts.
19 Tháng Mười Một, 2022, 9:33 chiều
En iyi orgazm porno vıdeolarını ücretsiz izle.
en iyi orgazm sikiş filmleri oYoH ile izlenir, kesintisiz seks merkezi.
OY KATEGORİLER VIDEO ARA. En Iyi Orgazm porno izle.
12:41. Masaj.
21 Tháng Mười Một, 2022, 12:33 sáng
Benadryl is commonly used to treat itchiness in dogs caused by skin allergies, and
it also reduces many of the other symptoms of allergies, including: Hives.
Swelling and inflammation. Redness.
21 Tháng Mười Một, 2022, 2:11 chiều
Dicyclomine is used to treat spasms of the muscles in the stomach and intestines.
It’s usually used for stomach and intestinal cramping in people with irritable bowel
syndrome (IBS). Dicyclomine starts working within 1 to 2
hours, but it needs to be taken four times a
day. COMMON BRANDS Bentyl (brand no longer available) DRUG CLASS Anticholinergic.
5 Tháng Mười Hai, 2022, 6:47 sáng
An impressive share! I have just forwarded this onto a co-worker who was doing a little research on this. And he actually bought me lunch due to the fact that I discovered it for him… lol. So let me reword this…. Thank YOU for the meal!! But yeah, thanx for spending some time to discuss this topic here on your internet site.|
24 Tháng Năm, 2023, 3:31 sáng
І really ⅼike thіs game. It’s moгe enjoyable than othеr gaqmes I’ѵe played.
27 Tháng Năm, 2023, 7:22 chiều
Great post! It was well-written and covered the subject in-depth.
28 Tháng Năm, 2023, 7:18 sáng
Your point of view caught my eye and was very interesting. Thanks. I have a question for you. https://accounts.binance.com/en/register-person?ref=P9L9FQKY
31 Tháng Năm, 2023, 12:16 chiều
Great post. Keep posting such kind of information on your page.
Im really impressed by it.
I will certainly digg it and in my opinion recommend to my friends.
I am confident they will be benefited from this web site.