韦初一的小窝

精于心 简于形

Rails use postgresql-adapter to compute postgis

老版本rails(4.1)项目的福音

rails中每种数据库都有自己的adapter,这些adapter负责处理数据库的各种数据类型,但是设计上无法自行增加新数据类型。使用postgis功能通常使用的是active-record-postgis-adapter,由于Reocar使用的功能仅仅是计算坐标点间的距离,增加这样一层适配器会导致应用结构变得复杂,同时也可能会引入新的问题。在实现现有功能的情况下尝试移除active-rec...

macOS使用brew安装用户级ruby

通过简单的脚本即可实现多版本管理

系统自带了一个ruby,但是这个ruby是保存在系统库中的,如果需要安装gem则会提示无权限You don't have write permissions for the /Library/Ruby/Gems/2.3 directory.。那么rvm呢,这货在安装ruby-2.3版本的时候总会出现openssl问题。 所以使用brew来安装一个user级的ruby,并通过简单脚本实现ru...

Ruby on Rails容器化实践(二点一)

适用于编译时有大量依赖的情况,基于Debian

这是Ruby on Rails容器化实践(二) - Archfish | Blog的简化版。 大致流程 确定程序运行依赖 从正常跑的环境找一个服务进程,获取其PID后,获取需要依赖的库,并记录下来。以下流程以MacOS环境来举例(懒癌晚期),在Linux环境中依赖为.so。 ➜ ~ ps aux | grep rails weihl 99276 0.0 ...

Ruby on Rails容器化实践(二)

基于Alpine的最小Docker镜像打包脚本

镜像的大小对容器运行资源占用并没有什么太大影响,多层次的镜像结构使得相同layout在每台docker主机上都是唯一一份,即Docker Images共享相同layout。选择alpine只是因为它易于使用且相关软件包都比较新。本文使用三个Dockerfile来分别处理Rails打包的三个阶段。 运行时镜像 即把Rails编译完成后的文件拷贝到该镜像上应当可以正常运行,无依赖问题。这里首...

Golang开发环境搭建(vs code)

带梯子和不带梯子两个版本

组织项目 许多从其它语言转到golang的可能都会有一个疑问:GOPATH是什么?官方的wiki是这样说的: The GOPATH environment variable specifies the location of your workspace. 即GOPATH指向一个工作区,可类比到Linux的文件系统,系统只能访问根(/)下的文件,而根之上是什么就不是系统管理的范...

Ruby on Rails文件存储整合S3 API

存储对应用透明,存储升级扩容更灵活

在项目初期我们将一台服务器插满硬盘并提供NFS服务挂载到各业务服务器上。业务产生的文件分为两类,一类是涉及隐私的敏感文件,另一类是可公开访问的普通文件。普通文件需要对接CDN以降低服务器带宽压力。敏感文件只能在相应业务使用到时才能访问,通常是先加载到内存然后再嵌入页面或Base64编码后通过JSON返回给前端。 在业务系统中使用CarrierWave作为文件上传管理组件,部分图片相关业务需...

Ruby on Rails容器化实践(一)

多环境服务架构设计

为了方便新功能的开发和对接Reocar的Staging环境从1个变成了8个,其中7个是用于新需求测试和第三方渠道对接,还有一个是预发布环境。 初代测试环境使用了基于KVM技术的虚拟机技术,对外需要占用一个公网IP。随着团队扩张,测试环境也跟着扩展到两个,这时公网IP的80端口已经被占用了,只能另外开端口进行服务。于是开启了测试环境的混沌时代,每增加一个环境就新增一组域名和端口,当增加到第三...

Rails日志组件封装

基于Ruby logger二次封装

在原始的单体应用中,日志通常直接输出到文件,然后由crontab中的定时任务做日志切分。再进一步,可能会有ELK系统收集分析。ELK只能对格式化的日志进行处理,对于无规则的日志只能作为字符串处理。Rails默认日志并不够简洁,对ELK来说处理难度略大。 结构 日志主要处理“谁在什么时间做了什么事情”的问题,下面就按这个思维来分析到底要怎么设计日志格式。 谁 服务组件可能会有很多...

Rails(4.1)中的缓存管理

复杂业务场景下的缓存淘汰方案

在rails中我们常用的有Rails#cache和IdentityCache这两种cache方式。在长期实践中发现了不少问题,于是我们研发了一个新的缓存组件CacheWorker。下面对这些组件进行大致介绍: IdentityCache 这是一种ActiveRecord Caching组件,提供了若干读方法,通过after_commit回调对缓存进行淘汰,我们业务系统中使用的是Redis...