t**r 发帖数: 3428 | |
c*********e 发帖数: 16335 | 2 还行,确实很快。用于real-time, chat room.现在websocket还没普及,所以socket.
io还是有市场的。
【在 t**r 的大作中提到】 : node现在还行么?用的地放多不多?
|
c******l 发帖数: 3972 | |
n****j 发帖数: 1708 | 4 尤其跟 mongo、angular 之类搭配,page render 放到前端,全都是 js 的东西,一根
肠子通到底,太爽了
【在 c*********e 的大作中提到】 : 还行,确实很快。用于real-time, chat room.现在websocket还没普及,所以socket. : io还是有市场的。
|
k**n 发帖数: 3989 | 5 你说们这些与node 不搭界呀...
node + express 是替代 iis,.net, apache ,java, php , 等server side的东东.
node.js的作用就是让你能用js 来写原来java,php,c#能写的服务瑞代码.
【在 c*********e 的大作中提到】 : 还行,确实很快。用于real-time, chat room.现在websocket还没普及,所以socket. : io还是有市场的。
|
c*********e 发帖数: 16335 | 6 最近在比较node.js和java concurrency,发现java concurrency对各种thread
interrupt, cancel之类的处理非常的精细,所以里面出了问题,可以写在一个log表里
面,日后检查出了什么问题,非常方便。
【在 n****j 的大作中提到】 : 尤其跟 mongo、angular 之类搭配,page render 放到前端,全都是 js 的东西,一根 : 肠子通到底,太爽了
|
p*****2 发帖数: 21240 | 7 how about go?
【在 c*********e 的大作中提到】 : 最近在比较node.js和java concurrency,发现java concurrency对各种thread : interrupt, cancel之类的处理非常的精细,所以里面出了问题,可以写在一个log表里 : 面,日后检查出了什么问题,非常方便。
|
l**********n 发帖数: 8443 | 8 单线程怎么和多线程比?你的思维真有趣。你肯定属于高智商人群。
【在 c*********e 的大作中提到】 : 最近在比较node.js和java concurrency,发现java concurrency对各种thread : interrupt, cancel之类的处理非常的精细,所以里面出了问题,可以写在一个log表里 : 面,日后检查出了什么问题,非常方便。
|
d******e 发帖数: 2265 | 9 node就是单线程的。所以你根本不用担心这些 interrupt, cancelde问题。
所以,java的精细到底是优点能还是缺点呢?
【在 c*********e 的大作中提到】 : 最近在比较node.js和java concurrency,发现java concurrency对各种thread : interrupt, cancel之类的处理非常的精细,所以里面出了问题,可以写在一个log表里 : 面,日后检查出了什么问题,非常方便。
|
l**********n 发帖数: 8443 | 10 有scala
【在 d******e 的大作中提到】 : node就是单线程的。所以你根本不用担心这些 interrupt, cancelde问题。 : 所以,java的精细到底是优点能还是缺点呢?
|
|
|
z*******3 发帖数: 13709 | 11 scala的thread也很蛋疼
上vert.x
【在 l**********n 的大作中提到】 : 有scala
|
l**********n 发帖数: 8443 | 12 actor
【在 z*******3 的大作中提到】 : scala的thread也很蛋疼 : 上vert.x
|
c*********e 发帖数: 16335 | 13 客户让你干一project,要求运行快,而且要求出错了要有出错信息,好fix issue.
这时你选node.js还是java concurrency呢?
【在 l**********n 的大作中提到】 : 单线程怎么和多线程比?你的思维真有趣。你肯定属于高智商人群。
|
l**********n 发帖数: 8443 | 14 node promise是 monad
【在 c*********e 的大作中提到】 : 客户让你干一project,要求运行快,而且要求出错了要有出错信息,好fix issue. : 这时你选node.js还是java concurrency呢?
|
c*********e 发帖数: 16335 | 15 node.js有类似java的shutdownnow()的方法吗?立刻停止所有的线程。
【在 l**********n 的大作中提到】 : node promise是 monad
|
d******e 发帖数: 2265 | 16 这个都是看log了,然后到log server 上去查吧。
就是你用python也又要有log 啊。
和语言美什么关系。
【在 c*********e 的大作中提到】 : 客户让你干一project,要求运行快,而且要求出错了要有出错信息,好fix issue. : 这时你选node.js还是java concurrency呢?
|
c*********e 发帖数: 16335 | 17 log也有大讲究,java里面,多线程的时候,把log text写入一个blockingqueue,让
consumer来把log写入数据库之类的地方。这是producer-consumer模式。
如果把logging放在node.js的async.each()里面,那会让程序变慢。写log其实是一个
很花时间的过程,尤其是有1百万个log text同时要写入数据库。
【在 d******e 的大作中提到】 : 这个都是看log了,然后到log server 上去查吧。 : 就是你用python也又要有log 啊。 : 和语言美什么关系。
|
z*******3 发帖数: 13709 | 18 vert.x就是actor
只不过文档不会像akka那样,到处都是含混晦涩的概念
immutable,state,actor满天飞
vert.x的文档几乎没出现过这些概念,虽然用的是同样的model
【在 l**********n 的大作中提到】 : actor
|
z*******3 发帖数: 13709 | 19
你用的log方式落伍了,直接上cassandra,把log丢到c*里面去
虽然涉及了io,但是会好很多,多数nosql最初的例子都是用来存log
log4j什么都太慢了,如果要用async,上worker
所有log通过bus发送给worker,然后由worker写入c*或者hdfs
反正log都是immutable,通过bus传输无压力
也可以通过shared object来发送
【在 c*********e 的大作中提到】 : log也有大讲究,java里面,多线程的时候,把log text写入一个blockingqueue,让 : consumer来把log写入数据库之类的地方。这是producer-consumer模式。 : 如果把logging放在node.js的async.each()里面,那会让程序变慢。写log其实是一个 : 很花时间的过程,尤其是有1百万个log text同时要写入数据库。
|
t**r 发帖数: 3428 | 20 log最好还是写到kafka里。
写到卡三里有点脱裤子放屁的感觉 |
|
|
z*******3 发帖数: 13709 | 21
c*经常用,kafka可未必常用
写到c*里一个考虑就是已经用了一个nosql
就不用再加东西进去了
log单独用一个框架才有一种脱裤子放屁的多余
【在 t**r 的大作中提到】 : log最好还是写到kafka里。 : 写到卡三里有点脱裤子放屁的感觉
|
p*****2 发帖数: 21240 | 22 我感觉jvm上做concurrency都很麻烦
【在 l**********n 的大作中提到】 : actor
|
p*****2 发帖数: 21240 | 23 kafka一般是多个consumer才用吧?
【在 z*******3 的大作中提到】 : : c*经常用,kafka可未必常用 : 写到c*里一个考虑就是已经用了一个nosql : 就不用再加东西进去了 : log单独用一个框架才有一种脱裤子放屁的多余
|
c*********e 发帖数: 16335 | 24 问题是,不是所有的project都是用的nosql啊。现在大部分公司还是用的传统的rdbs.
很多startup用的mysql之类的免费的数据库。
写log,通常是写入log file,或者数据库。
【在 z*******3 的大作中提到】 : : c*经常用,kafka可未必常用 : 写到c*里一个考虑就是已经用了一个nosql : 就不用再加东西进去了 : log单独用一个框架才有一种脱裤子放屁的多余
|
c*********e 发帖数: 16335 | 25 node.js有类似java的shutdownnow()的方法吗?立刻停止所有的线程。
感觉node.js对突发accident,exception的处理没有java concurrency那么全面细致。
所以,如果网站做出来放到live上去了,突然有一天出事了,都不知道什么原因。这个
是非常头疼的事情。
【在 z*******3 的大作中提到】 : : c*经常用,kafka可未必常用 : 写到c*里一个考虑就是已经用了一个nosql : 就不用再加东西进去了 : log单独用一个框架才有一种脱裤子放屁的多余
|
p*****2 发帖数: 21240 | 26 不知道你在说什么
你有学过node吗
【在 c*********e 的大作中提到】 : node.js有类似java的shutdownnow()的方法吗?立刻停止所有的线程。 : 感觉node.js对突发accident,exception的处理没有java concurrency那么全面细致。 : 所以,如果网站做出来放到live上去了,突然有一天出事了,都不知道什么原因。这个 : 是非常头疼的事情。
|
c*********e 发帖数: 16335 | 27 我已经给公司写了一个node.js程序,正成功运行。貌似node.js的async确实快,但是
对突发事件和危机的处理不象java那么全面周到。毕竟,java出来有些年头了,现在版
本到8了。
【在 p*****2 的大作中提到】 : 不知道你在说什么 : 你有学过node吗
|
p*****2 发帖数: 21240 | 28 node只是脚本 功能性肯定没java全面
可是java做concurrency也很麻烦
node的异常 错误处理方式跟java很不一样 跟go到类似
你说说你想处理什么情况呀 不要说什么thread node本来就是single thread的 说说你
想做什么就可以了
【在 c*********e 的大作中提到】 : 我已经给公司写了一个node.js程序,正成功运行。貌似node.js的async确实快,但是 : 对突发事件和危机的处理不象java那么全面周到。毕竟,java出来有些年头了,现在版 : 本到8了。
|
c*********e 发帖数: 16335 | 29 比如说,要写一个发email的project,要求快,而且要realtime显示发了多少email (a)
,实际送
出去多少(b),有多少被drop掉(c),而且这3个real time数字要加起来有a= b + c.
【在 p*****2 的大作中提到】 : node只是脚本 功能性肯定没java全面 : 可是java做concurrency也很麻烦 : node的异常 错误处理方式跟java很不一样 跟go到类似 : 你说说你想处理什么情况呀 不要说什么thread node本来就是single thread的 说说你 : 想做什么就可以了
|
d******e 发帖数: 2265 | 30 这个一般都丢后台,用celery, actor什么的搞了。前面node直接返回了。
你这个real time 设计很有难度啊。
【在 c*********e 的大作中提到】 : 比如说,要写一个发email的project,要求快,而且要realtime显示发了多少email (a) : ,实际送 : 出去多少(b),有多少被drop掉(c),而且这3个real time数字要加起来有a= b + c.
|
|
|
p*****2 发帖数: 21240 | 31 用redis不行吗
【在 d******e 的大作中提到】 : 这个一般都丢后台,用celery, actor什么的搞了。前面node直接返回了。 : 你这个real time 设计很有难度啊。
|
l**********n 发帖数: 8443 | 32 node是单线程,所以和java自然不同,异常分可处理的,和不可处理的。node应该写成
fp, 和scala类似。写成oop是不行的。
【在 c*********e 的大作中提到】 : node.js有类似java的shutdownnow()的方法吗?立刻停止所有的线程。 : 感觉node.js对突发accident,exception的处理没有java concurrency那么全面细致。 : 所以,如果网站做出来放到live上去了,突然有一天出事了,都不知道什么原因。这个 : 是非常头疼的事情。
|
d******e 发帖数: 2265 | 33 没研究。celery, actor是 task battery pool. redis还是充当消息queue吧。
【在 p*****2 的大作中提到】 : 用redis不行吗
|
c*********e 发帖数: 16335 | 34 对呀。市面上有的email发送服务,就做不到realtime 的 a = b + c. 其实也可以来个
cheat,先把b,c算出来,然后b+c的值赋给a.不过这个对我们程序员来说就没什么价值了。
【在 d******e 的大作中提到】 : 这个一般都丢后台,用celery, actor什么的搞了。前面node直接返回了。 : 你这个real time 设计很有难度啊。
|
z*******3 发帖数: 13709 | 35
a)
vert.x mail&streaming api
轻轻松松
【在 c*********e 的大作中提到】 : 比如说,要写一个发email的project,要求快,而且要realtime显示发了多少email (a) : ,实际送 : 出去多少(b),有多少被drop掉(c),而且这3个real time数字要加起来有a= b + c.
|
z*******3 发帖数: 13709 | 36 java8, rxjava什么最新的api里面有一种streaming的api
这个用来搞什么real time的counting是绝佳的设计
以前只能用storm这些,现在很多都能用了
还有scalaz这些,不过估计你不太了解
rxjava是这些东东里面最简单的一个,vert.x也很简单
加上vert.x也有mail,web这些,所以用vert.x最好
http://vertx.io/docs/vertx-rx/java/ |
z*******3 发帖数: 13709 | 37
了。
vert.x的优势在这个case中发挥得淋漓尽致
首先第一,vert.x不拘泥于web,所以mail很容易搞掂
其次第二,支持多线程,大并发ok
最后第三,支持streaming,单机单node上做汇总ok
这样通过多个层面在单个node上的集成,可以直接干掉不必要的io操作
全部在内存中完成,以实现realtime的要求
实际上vert.x很多use cases都是realtime gaming
比起游戏来说,你这个小意思了
如果realtime要求再高点,就需要介入控制gc了
【在 c*********e 的大作中提到】 : 对呀。市面上有的email发送服务,就做不到realtime 的 a = b + c. 其实也可以来个 : cheat,先把b,c算出来,然后b+c的值赋给a.不过这个对我们程序员来说就没什么价值了。
|
z*******3 发帖数: 13709 | 38 写一个verticle,用来对付mail,你的逻辑都在这里面
需要同时对付大并发,你就直接部署多个这样的verticles就好了
然后逻辑完成之后,异步发送json给另外一个verticle
这个verticle就是你的streaming verticle,用rxjava
用来统计a = b+c这些计算
json就是你的msg,就是最后一个结果的msg/json
这样都在同一个虚拟机内完成,就是纯粹的内存计算
就可以直接规避redis,akka,node这些集成带来的不同层之间的io操作 |
z*******3 发帖数: 13709 | 39
用vert.x就可以做到real time咯
不需要用到跨tiers的io
直接用vert.x自带的bus就可以发送消息了
然后其他逻辑几乎可以照抄你说的所有逻辑
做一个verticle来取代node
再做另外一个verticle来取代akka
ok啦
vert.x就是强大,看懂了vert.x,这些东西都是小意思
【在 d******e 的大作中提到】 : 这个一般都丢后台,用celery, actor什么的搞了。前面node直接返回了。 : 你这个real time 设计很有难度啊。
|
z*******3 发帖数: 13709 | 40 最后还有一个,计算之后的结果,abc这些显示在哪?
如果是real time,你这个gui还得好好设计一下
一种方式就是gui上做一个listener
然后streaming那个verticle处理每一条msg之后
广播出去,gui上接收到后自动update
用udp和异步处理就好了
就是这一步实现起来不比前两步实现起来要容易
虽然gui貌似很low,用不到多少高潮的算法和high逼格的数据结构
但是实际上gui是客户体验的高潮部分,也往往是比较难做的部分
tableau光做一个visualisation,就做成那么大生意
对手下码农开的工资比flg都高,这一块大有可为 |
|
|
z*******3 发帖数: 13709 | 41 vert.x的bus有c++的客户端
如果gui用c++写的话,可以直接接收来自bus里面的msg
但是这个搞起来会比较复杂
我倾向于再写一个广播的verticle
然后自选协议,udp比较好,然后接收到后update
这个应该js, swift, android都可以搞掂,就swift会麻烦点
需要用到第三方类库 |
p*****2 发帖数: 21240 | 42 redis可以做counter 而且是persistent的
【在 d******e 的大作中提到】 : 没研究。celery, actor是 task battery pool. redis还是充当消息queue吧。
|
p*****2 发帖数: 21240 | 43 drop是怎么算的
了。
【在 c*********e 的大作中提到】 : 对呀。市面上有的email发送服务,就做不到realtime 的 a = b + c. 其实也可以来个 : cheat,先把b,c算出来,然后b+c的值赋给a.不过这个对我们程序员来说就没什么价值了。
|
c*********e 发帖数: 16335 | 44 drop就是没发出去,不管什么原因。我把问题简化了。其实drop里有好几种。
这个real time 显示确实有难度。当然,你可以cheat,先把b,c算出来,然后b+c的值赋
给a.这个,骗骗外行,外行还是挺兴奋的。
drop是怎么算的
了。
【在 p*****2 的大作中提到】 : drop是怎么算的 : : 了。
|
p*****2 发帖数: 21240 | 45 难度主要在哪里
【在 c*********e 的大作中提到】 : drop就是没发出去,不管什么原因。我把问题简化了。其实drop里有好几种。 : 这个real time 显示确实有难度。当然,你可以cheat,先把b,c算出来,然后b+c的值赋 : 给a.这个,骗骗外行,外行还是挺兴奋的。 : : drop是怎么算的 : 了。
|
c*********e 发帖数: 16335 | 46 难度在,realtime很有可能 a != b + c
【在 p*****2 的大作中提到】 : 难度主要在哪里
|
p*****2 发帖数: 21240 | 47 主要什么原因
【在 c*********e 的大作中提到】 : 难度在,realtime很有可能 a != b + c
|
c*********e 发帖数: 16335 | 48 async的时候,就象马拉松赛跑,你不可能随时都让某3个人保持一定距离。
【在 p*****2 的大作中提到】 : 主要什么原因
|
p*****2 发帖数: 21240 | 49
我不理解async还是sync对于这三个值的计算有什么区别。你能仔细谈谈吗?
【在 c*********e 的大作中提到】 : async的时候,就象马拉松赛跑,你不可能随时都让某3个人保持一定距离。
|
z*******3 发帖数: 13709 | 50
用swift伪码来解释就是
dispatch_async(queue){
//task 1 -> update b/c&update a
}
dispatch_async(queue){
//task 2 -> update b/c&update a
}
dispatch_async(queue){
//task 3 -> update b/c&update a
}
这三个tasks结束的顺序可能是213, 123或者其他什么
然后存a=b+c的时候,一个task需要存两次
一次存b/c,一次存a
当某个task update b/c之后,还没update a的时候,那么完成的b和c的任务总数会等
于a+1
同时,当某两个tasks同时update a的时候,两个都取到a,然后两个都+1之后再update
最后的结果就不是a+2,而是a+1
数据库常见的读写lock,什么dirty read之类的并发问题
用transaction可以搞定,如果是hdfs的话,用zookeeper,如果是内存的话
用java.util.concurrency,如果是vert.x的话,用worker thread+bus msg
如果是swift的话,用dispatch_sync
【在 p*****2 的大作中提到】 : : 我不理解async还是sync对于这三个值的计算有什么区别。你能仔细谈谈吗?
|
|
|
z*******3 发帖数: 13709 | 51 昨天刚琢磨的gcd,如果要share data between threads的话,用这个
public class SynchronizedArray {
private var array: [T] = [];
private let accessQueue = dispatch_queue_create("SynchronizedArrayAccess
", DISPATCH_QUEUE_SERIAL);
public func append(newElement: T) {
dispatch_async(self.accessQueue) {
self.array.append(newElement);
}
}
public func get() -> T?{
var object:T?;
dispatch_sync(self.accessQueue) {
if self.array.count > 0{
object = self.array.removeAtIndex(0)
}
}
return object;
}
public subscript(index: Int) -> T {
set {
dispatch_async(self.accessQueue) {
self.array[index] = newValue;
}
}
get {
var element: T!;
dispatch_sync(self.accessQueue) {
element = self.array[index];
}
return element;
}
}
} |
p*****2 发帖数: 21240 | 52 这个跟async有什么关系 multi thread不一样吗
用redis就可以解决
【在 z*******3 的大作中提到】 : 昨天刚琢磨的gcd,如果要share data between threads的话,用这个 : public class SynchronizedArray { : private var array: [T] = []; : private let accessQueue = dispatch_queue_create("SynchronizedArrayAccess : ", DISPATCH_QUEUE_SERIAL); : : public func append(newElement: T) { : dispatch_async(self.accessQueue) { : self.array.append(newElement); : }
|
p*****2 发帖数: 21240 | 53 node的话 如果不persistent 传给master就可以了
SynchronizedArrayAccess
【在 z*******3 的大作中提到】 : 昨天刚琢磨的gcd,如果要share data between threads的话,用这个 : public class SynchronizedArray { : private var array: [T] = []; : private let accessQueue = dispatch_queue_create("SynchronizedArrayAccess : ", DISPATCH_QUEUE_SERIAL); : : public func append(newElement: T) { : dispatch_async(self.accessQueue) { : self.array.append(newElement); : }
|