You are on page 1of 41

Javascript on Fiber

@孢⼦子响⻢马
2014.10.25
什么是 fibjs?
• 服务器端 Javascript 开发
• 基于 Google v8 引擎构建
• 完全⾮非阻塞,fiber 驱动,拒绝回调,类似 goroutine
• CommonJS 模块系统
• 80,000+ ⾏行 c/c++ 代码,充分挖掘多核性能
• 27 个基本模块,覆盖常⻅见服务器应⽤用场景
27 个内置模块
82 个公开对象类型
object

+ dispose()
+ toString()
+ toJSON()
+ valueOf()

Image
+ width
+ height Redis
+ format
+ type
+ colorsTotal
Buffer + transparent + command()
+ alphaBlending + set()
+ operator[] + setNX()
+ length + getData() + setXX()
Expect + save() + mset()
+ Buffer()
+ save() + mset()
+ Buffer() + to + colorAllocate() + msetNX()
+ Buffer() + be + colorAllocate() + msetNX()
+ resize() + been
+ write() + colorAllocateAlpha() + append()
+ is + colorAllocateAlpha() + setRange()
+ write() + that + colorClosest() + getRange()
+ write() + and + colorClosest() + strlen()
+ readUInt8() + have
+ readUInt16LE() + colorClosestHWB() + bitcount()
+ with + colorClosestHWB() + get() Url X509Cert XmlNode
+ readUInt16BE() + at MongoCollection
+ colorClosestAlpha() Int64 + mget()
+ readUInt32LE() + of PKey + href + version + nodeType
+ colorClosestAlpha() + operator[String] + mget() RedisHash RedisList Stat
+ readUInt32BE() + same List Message + protocol + serial + nodeName
+ readInt8() + colorExact() + hi LevelDB + getset() RedisSortedSet
+ not + colorExact() + find() MongoCursor + name + decr() + slashes + issuer + nodeValue
+ readInt16LE() HttpCookie + lo LruCache RedisSet + name
Cipher + deep HttpCollection + colorExactAlpha() + operator[] Map + value + findOne() + keySize Queue + incr() Smtp Trigger + auth + subject X509Req + ownerDocument
+ readInt16BE() SandBox + size
DbConnection + ok + colorExactAlpha() + Int64() + length + params + findAndModify() + publicKey + setBit() + set() + push() Stats TcpServer + username + notBefore + parentNode
+ readInt32LE() GridFS + name + size MongoDB + mode X509Crl
+ name + true + operator[String] + colorResolve() + Int64() + has() + size + result + insert() + length + getBit() + setNX() + push() + add() Regex + socket + password + notAfter + subject + childNodes
+ readInt32BE() + keySize + false + value HttpUploadData + List() + operator[String] + body + skip() + PKey() + mtime + operator[String] Stream + socket TextColor + host + ca + publicKey + firstChild
Digest + files + domain + colorResolve() + Int64() + get() Lock + LruCache() + insert() + operator[String] + exists() + mset() + pop() + add() + add() + atime
+ readInt64LE() + ivSize DBRow + null + clear() + resize() + length + limit() + genRsaKey() + Queue() + lastIndex + Smtp() + handler + Trigger() + hostname uuidValue + pathlen + lastChild XmlNodeList
Fiber Function + chunks Handler + path + fileName + colorResolveAlpha() + Int64() + mget() + clear() + save() + fs MongoID + type() + mset() + rpush() + add() + score() + SandBox() + ctime + notice
+ readInt64BE() + blockSize + close() + size + undefined + has() + push() + Map() + stream + sort() + genEcKey() + add() + global + connect() + Stats() + stats + on() + port + usage + X509Req() + previousSibling
+ operator[] + expires + contentType + colorResolveAlpha() + equal() + set() + has() + update() + keys() + get() + rpush() + remove() + incr() + SandBox() + warn + X509Crl() + length
+ readFloatLE() + begin() + function + caller + first() + push() + clear() + response + hasNext() + isPrivate() + offer() + ignoreCase + command() + Stats() + on() + path + type + X509Req() + nextSibling
+ readFloatBE() + Cipher() + commit() + operator[String] + update() + retrieve() + all() + httpOnly + contentTransferEncoding + colorDeallocate() + compare() + mset() + pop() + Lock() + get() + has() + update() + next() + getCollection() + clone() + remove() + del() + mget() + rpop() + remove() + remove() + add() + hello() + isWritable() + inc() + read() + TcpServer() + error + once() + load() + load() + operator[]
+ object + store() + clip() + shiftLeft() + remove() + get() + remove() + runCommand() + del() + mget() + set() + len() + remove() + multiline + add() + isReadable() + write() + pathname + data() + publicKey + load()
+ readDoubleLE() + Cipher() + rollback() + digest() + join() + start() + invoke() + add() + secure + body + slice() + acquire() + get() + Message() + count() + importKey() + poll() + login() + dec() + TcpServer() + highLight + once() + load() + hasChildNodes()
+ array + store() + getPixel() + shiftRight() + remove() + set() + runCommand() + runCommand() + expire() + incr() + get() + exists() + len() + addScript() + isExecutable() + close() + search + detail() + next + loadFile() + item()
+ readDoubleBE() + Cipher() + execute() + digest() + string + add() + concat() + release() + put() + read() + size() + importKey() + element() + exec() + from() + add() + run() + off() + query + loadFile() + normalize()
+ exists() + HttpCookie() + getTrueColorPixel() + and() + forEach() + put() + runCommand() + oid() + ttl() + getAll() + insertBefore() + members() + count() + remove() + isHidden() + copyTo() + dump()
+ writeUInt8() + paddingMode() + execute() + number + set() + every() + put() + readAll() + forEach() + exportPem() + peek() + test() + to() + reset() + asyncRun() + off() + hash + X509Cert() + exportPem() + cloneNode()
+ writeUInt16LE() + encrypt() + format() + remove() + set() + HttpCookie() + setPixel() + or() + between() + filter() + put() + remove() + write() + drop() + map() + close() + exportDer() + clear() + persist() + keys() + insertAfter() + pop() + range() + run() + data() + isDirectory() + uptime() + stop() + off() + load() + clear() + exportDer() + lookupPrefix()
+ boolean + parse() + setThickness() + xor() + begin() + remove() + ensureIndex() + rename() + len() + remove() + randMember() + rangeRev() + require() + isFile()
+ writeUInt16BE() + decrypt() + exist + remove() + forEach() + isEmpty() + clear() + toArray() + encrypt() + toArray() + quit() + trigger() + Url() + load() + sign() + lookupNamespaceURI()
+ match() + line() + add() + commit() + isEmpty() + reIndex() + renameNX() + exists() + trim() + randMember() + rank() + isSymbolicLink()
+ writeUInt32LE() + map() + sendTo() + hint() + decrypt() + Url() + loadFile() + insertBefore()
+ rectangle() + sub() + close() + dropIndex() + sub() + del() + len() + rankRev() + isMemory()
+ writeUInt32BE() + a() + filledRectangle() + toNumber() + toArray() + readFrom() + dropIndexes() + sign() + sub() + del() + range() + isSocket() + parse() + loadRootCerts() + insertAfter()
+ writeInt8() + an() + verify() + format() + verify() + appendChild()
+ polygon() + toString() + getIndexes() + unsub()
+ writeInt16LE() + equal() + resolve() + dump() + replaceChild()
+ openPolygon() + getCollection() + unsub()
+ writeInt16BE() + eql() + normalize() + clear() + removeChild()
+ filledPolygon() + unsub()
+ writeInt32LE() + above()
+ writeInt32BE() + greaterThan() + ellipse() + unsub()
+ filledEllipse() + psub()
+ writeInt64LE() + least()
+ arc() + psub()
+ writeInt64BE() + below()
+ filledArc() + unpsub()
+ writeFloatLE() + lessThan() + fill() + unpsub()
+ writeFloatBE() + most()
+ fillToBorder() + unpsub()
+ writeDoubleLE() + property()
+ colorReplace() + unpsub()
+ writeDoubleBE() + property()
+ clone() + onsuberror()
+ slice() + closeTo()
+ hex() + resample() + pub()
+ crop() + getHash()
+ base64()
+ flip() + getList()
+ toString()
+ rotate() + getSet()
+ toString() + convert() + getSortedSet()
+ copy() + dump()
+ copyMerge() + restore()
+ copyMergeGray() + close()
+ copyResized()
+ copyResampled()
+ copyRotated()

XmlElement
XmlDocument
Socket + namespaceURI
+ inputEncoding
HttpMessage + prefix
BufferedStream + family + xmlStandalone
+ localName
+ protocol + type + xmlVersion + tagName
+ stream + remoteAddress + doctype
HttpHandler Event + headers SeekableStream SslSocket HttpServer XmlCharacterData + id
Condition + charset + remotePort SslServer + documentElement
SslHandler Semaphore + keepAlive + textContent
Chain PacketHandler Routing DBResult BlockQueue + EOL + localAddress + head XmlDocumentType
MySQL SQLite + crossDomain + maxHeadersCount + verification + crossDomain + data + innerHTML XmlProcessingInstruction
AsyncWait + forceGZIP + verification + maxUploadSize PacketMessage + localPort + ca + forceGZIP + verification + length + title + className
+ maxSize + insertId + BufferedStream() + ca + body + name
+ rxBufferSize + fileName + maxHeadersCount + ca + Event() + seek() + peerCert + maxHeadersCount + attributes + target
+ handler + affected + Condition() + maxSize + readText() + Socket() + publicId
+ txBufferSize + timeout + maxUploadSize + handler + isSet() + Semaphore() + hasHeader() + tell() + maxUploadSize + substringData() + data
+ Chain() + stats + Routing() + fields + Condition() + BlockQueue() + readLine() + connect() + SslServer() + XmlDocument() + systemId
+ handler + set() + wait() + firstHeader() + rewind() + SslSocket() + httpStats + appendData() + getAttribute()
+ use() + backup() + end() + append() + append() + SslHandler() + wait() + pulse() + post() + allHeader() + PacketMessage() + put() + readLines() + size() + bind() + SslSocket() + SslServer() + insertData() + load() + getAttributeNS()
+ append() + stats + PacketHandler() + append() + notify() + take() + readUntil() + bind() + SslServer() + getElementsByTagName()
+ SslHandler() + clear() + trywait() + addHeader() + readAll() + connect() + HttpServer() + deleteData() + setAttribute()
+ notifyAll() + readPacket() + listen() + SslServer() + getElementsByTagNameNS()
+ HttpHandler() + wait() + addHeader() + stat() + accept() + HttpServer() + replaceData() + setAttributeNS()
+ writeText() + accept() + createElement()
+ setHeader() + removeAttribute()
+ setHeader() + writeLine() + recv() + createElementNS() + removeAttributeNS()
+ writePacket() + recvFrom() + createTextNode()
+ removeHeader() + hasAttribute()
+ send() + createComment()
+ hasAttributeNS()
+ sendto() + createCDATASection()
+ getElementsByTagName()
+ createProcessingInstruction() + getElementsByTagNameNS()

HttpRequest
HttpsServer
HttpResponse File MemoryStream
+ method + verification
+ address + status + name XmlComment XmlText
+ ca
+ queryString + cookies
+ cookies + truncate() + MemoryStream()
+ HttpsServer()
+ form + HttpResponse() + eof() + setTime() + HttpsServer() + splitText()
+ query + addCookie() + flush() + clone()
+ HttpsServer()
+ redirect() + chmod() + clear()
+ HttpsServer()
+ HttpRequest()

XmlCDATASection
更多模块持续发展中
fibjs 和 nodejs 有什么不同?
来看⼀一段常⽤用的数据库操作
nodejs fibjs
等⼀一下!!!!!!

nodejs 告诉我们:

会阻塞,导致其他任务不能运⾏行。
写这样的代码难道不会被打吗?
nodejs ⼀一直说: sync 是邪恶的
祂们说:

In busy processes, the programmer is strongly


encouraged to use the asynchronous versions of these
calls. The synchronous versions will block the entire
process until they complete--halting all connections.
⽽而 module.js ⾥里华丽丽滴写着这样的代码
因此 nodejs 在 require 时不响应请求
fibjs 不会出现这样的尴尬

当调⽤用阻塞⽅方法时,
fibjs 会保护现场,挂起当前
fiber,并将 Javascript 引擎切
换⾄至下⼀一个排队的 fiber。挂起
的 fiber 在⼯工作完成后会进⼊入
排队队列等待恢复
fibjs 有三种类型的线程(nodejs 类似)
Javascript 线程 ⼯工作线程池 异步 io 线程
Javascript 线程是 fibjs 的主线程
Javascript 线程 • ⼀一个 fibjs 进程只有⼀一个 Javascript 线程
• Javascript 线程内会运⾏行多个 fiber
• Javascript 代码在 fiber 内运⾏行
• 同⼀一时刻只会有⼀一个 fiber 激活
• 当前 fiber 休眠时其它 fiber 才会恢复
• fiber 不释放就会把 Javascript 塞住
socket 操作会委托给异步 io 线程处理
Javascript 线程 异步 io 线程

sock.recv

return
阻塞操作也会委托给⼯工作线程池处理
Javascript 线程 ⼯工作线程池

fs.readFile

return
最终避免 fiber 阻塞导致 Javascript 被挂起
fibjs 的并发:轻量的⽤用户空间线程 fiber
• 操作系统线程的切换成本昂贵
• fiber 是在应⽤用级的线程系统
• 运⾏行现场完整保护,对应⽤用开发透明
• 可以直接使⽤用的编程逻辑,包括 try/catch
• 基于堆栈切换现场,模块调⽤用和返回更⾼高效
• ⾮非抢先,⽆无需内存级锁,并发逻辑简单
再回顾⼀一下这两段代码,是不是很爽
nodejs fibjs
nodejs 常说: 使⽤用回调,所以更快?
祂们⽤用 Apache 和 nginx 的对⽐比来证明
⽽而事实上,异步并不等同于回调
这是⼀一个 web 服务器基准测试
fibjs nodejs
60,000

50,000
每秒请求数

40,000

30,000

20,000

10,000

0
100 500 900 1300 1700 2100 2500 2900 3300 3700 4100 4500 4900
并发连接
平均 7.25 倍
有⺴⽹网友祭出 cluster ⼤大法
但是 fibjs 真的是多线程吗?
fibjs 同样是单线程的
• fibjs 和 nodejs 都是以 v8 为脚本引擎
• v8 本⾝身被设计为 isolate 不⽀支持多线程
• nodejs 使⽤用异步回调复⽤用 v8 线程
• fibjs 使⽤用 fiber 复⽤用 v8 线程
• 因此 fibjs 和 nodejs 都是单线程
那么 fibjs 快在哪⾥里呢?
Javascript 线程是珍贵的计算资源
Javascript 线程
fibjs 将更多的计算移⾄至⼯工作线程池
Javascript 线程 ⼯工作线程池 异步 io 线程
⼯工作线程不再仅仅完成阻塞操作
⼯工作线程池

• 同步 io 操作,⽐比如磁盘操作,⽂文件处理
• 计算密集的⽅方法,⽐比如加密,压缩,图像
• 异步 io 基础上的复杂逻辑,⽐比如协议处理

ps: 异步 io 基础上的计算,全部以异步⽅方式完成,并
发性能更⾼高。
从⽽而提⾼高 Javascript 线程利⽤用率
Javascript 线程 Javascript 线程
多线程的⼯工作线程池也可以发挥多核性能
Javascript 线程 ⼯工作线程池 异步 io 线程
fibjs 是更彻底的异步
并将异步延伸⾄至⼯工作线程池
只是不在 js 层表现出来
fibjs 的应⽤用逻辑是在太过于直⽩白和简单
毫⽆无 nodejs 回调处理的各种惊艳技巧
就不再展⽰示那些毫⽆无趣味的⽰示例代码了
良好的⽣生态从积极参与和分享开始

⺴⽹网站: http://fibjs.org/
代码: https://github.com/xicilion/fibjs
社区: http://baoz.cn/fibjs
fibjs ⼯工程实践:孢⼦子社区 baoz.cn
孢⼦子社区的 fibjs 实践
• 基于 http ⻓长连接的客户端消息推送
• 基于 tcp 的移动 app 消息推送
• 基于 fiber 的数据并⾏行读取
• 基于 fiber 的后台运算异步化
• 基于 SandBox 的服务器端模块 app 化与数据隔离
• 基于 SandBox 的服务器代码热升级
欢迎加⼊入孢⼦子团队
简历请寄 info@baoz.cn
Javascript on Fiber

You might also like