忍得了初一,忍不了清明
Common Lisp 的 WebSocket 还不成熟吧(毕竟WebSocket也是近不到10年才有的, 而Lisp早两十年)? 我用的是 Hunchensocket
(也试过 websocket-driver
), 一直是有点小问题,例如用户每次断开连接时会报错(作者也声明了暂时解决不了,不过不影响程序)
上传二进制文件(例如图片)不能正常
但是我已经建立好了自己基于
WebSocket
的后台框架(比HTTP框架简单许多)
我突然想到,能不能用 node.js
的 WebSocket (第三方的)框架作一个中介, 接受到客户端的数据, 可以处理某些请求例如文件上传, 再与 Lisp(当然运行在同一个主机) 建立 TCP socket(SBCL 2.3.1 User Manual) 框架来搭配?
我试过用node
的 WebSocket 框架挺快, 上传文件是秒传, 大多数开发者(和我以前)是用 socket.io
实际上也是先经过nginx, 也就是从用户到Lisp总共有3个socket连接, 应该也不会对速度影响多大吧?
请教这可行吗?
还是说大多数就是这样用的? 都是多个服务器通过socket来实现"混合双打"? 性能也不会多耗费多少?
某些请求用node
来处理,某些用Lisp
来处理?
某些应用(可能很多?)在node
上已经有成熟的npm包了, 而Lisp可能要麻烦得很
例如昨天我才用上的管理员在创建产品时后台自动生成海报, 用的是 node-canvas [GitHub - Automattic/node-canvas: Node canvas is a Cairo backed Canvas implementation for NodeJS.] (客户端包括小程序, 生成再上传也可以但是更麻烦), 而用 Lisp 来做麻烦多了(也因为我对 JavaScript 的 canvas 已经经验丰富了吧…)
当前做法是CL每次请求通过 run-program
(shell) 新建一个node进程来生成这个海报
并不常见,一般来讲一个 webocket 就够了。两个的场景就是有一个是连 dev server 做 hot reload 之类的。
websocket 是一个, 因为链接客户端, 我指的不是客户端跟 node 和 Lisp 各建立一个webSocket, 而是 后台的node和Lisp建立 TCP socket, 也就是node也是做一个中间层(就像 NGINX)
原因是 Lisp 有点"不擅长"创建 WebSocket, 所以找个node来担个中介 (我还不确定是否可行, 所以请教)
我觉得这不是个好的技术选型,显然 node 比 common lisp 更适合干这类事。当然你一定要 common lisp 的话,也可以自己做轮子的。
PS,nginx 做代理是常见的,我是觉得选这两个语言协作并不好。
我已经用 Common Lisp 搭建好了自己的框架且已经实现了自己需要的绝大多数功能了(不过大部分就是调用自定义的Postgres函数), 但有少部分问题我想改用其它语言来解决更方便了
某些地方也是直接调用工具进程, 例如处理用户上传的图片/头像( ImageMagick ), 2年前还真不会这一招
wsug
6
仅仅只是上传文件图片不用WebSocket也可以的吧,通过http就能传,也能用js取到上传进度,当然用WebSocket上传也是很不错的,可定制程度应该更高
是的, 我现在就是HTTP上传的, 稍微麻烦一点的是要多一个权限验证
因为用 WebSocket 验证就简单多了一次就够了
不过这些不是重点, 重点是我现在已经确定了后台是用WebSocket + (Common Lisp 而不是 node.js), 但是Common Lisp的WebSocket 框架很不成熟, 例如每个会话结束的时候标示错误(但不影响, 因为用户已经断开了), 上传不了文件(而在node很简单), 所以担心会不会迟早又遇到更棘手的问题…
所以我想用熟悉的node.js 做一个中间层来建立WebSocket获取客户端数据, 再通过 原生Socket于Common Lisp 主服务器传输大部分数据, 就相当于 Express/Koa 框架的一个 验证层
例如:
服务端就通过增加两行代码和在Postgres的函数, 客户端(JavaScript) 也只需要一行代码就请求了, 不觉得非常简单吗? 要修改数据的时候只需要修改Postgres的函数, 不用动服务器
我甚至弄了更简单的只需要一行代码 (如果不需要参数, 例如数据总览, $memorize 就是缓存这个请求)
wsug
8
服务器端数据多转发几层也可以的,客户端除了js还是js,但服务器端不一样,可以多种编程语言共用(楼主用了lisp想必也是不怕被项目后续接手维护的人xxx)。比如我服务器端主要用的是php,需要用nodejs时直接 echo file_get_contents("http://localhost:3000");
,也懒得去研究其它传数据的办法了。
可能很多人也想用Common Lisp,但因为在国内用的人太少等原因不敢用,望楼主用过后也能写篇文章分享经验心得,让有心想用的人少踩一点坑
是啊 之前的项目我都是只会用node, 现在知道应该可以搭配 child_process
少了很多时间去早npm对应的代码库(例如图片处理), 甚至其实很多npm代码库本身就是通过child_process
来实现的(我猜)
去年开始用 Lisp, 从 Hunchentoot
开始入手, 积累自己的基本代码库, 然后是服务器库(模仿node的 Express/Koa) 自我任务灵活性已经不输给Express了(本人起名为 smart-server
canskit
management-system
这几个都是其它项目共用的项目) 真是每做一个项目花的时间越少!!
我也上传到了GitHub(不过最近半年不断在优化更新没有上传上去) 不过没人会看到的呢 因为根本没人用
没关系, 毕竟黑客也不多, 用Lisp 的很少, 有兴趣优化地球的人也不多
现在很多也是前端编译后再上传了, 可以不是js了, 例如TypeScript, 不过我体验了TS后还是觉得JS更好用, 现在JS已经越来越完善了, 毕竟是Lisp的后裔 而Common Lisp 就可以只靠用户来去完善嘛(第一无二的macro
代码的语法与数据想通 就是空格隔开的list 我觉得确实更接近大自然)